Elly08 Ответов: 1

Как остановить асинхронное ожидание в VB.NET?


У меня есть асинхронное ожидание метод в моей форме, который я вызвал при нажатии кнопки button1. Как мне остановить асинхронное ожидание когда я нажимаю кнопку button2?

Что я уже пробовал:

Private Async Sub Flash()
	While True
		Await Task.Delay(100)
		Label1.Visible = Not Label1.Visible
	End While
End Sub


Выше код мой Асинхронное Ожидание метод

Ralf Meier

Чего вы пытаетесь достичь ?..
Я думаю (но не уверен), что ваш подход неверен ...

Elly08

Я делаю что-то вроде будильника, где, когда время истекает, метка будет продолжать мигать и останавливать мигание при нажатии кнопки button2.

Elly08

Я имею в виду эту ссылку http://stackoverflow.com/questions/42970996/how-to-make-a-label-blink и сделать что-то вроде этого.

Ralf Meier

Таким образом, у вас есть свой собственный (ciústomized control / Label) ...
Как насчет использования (например) экземпляра таймера в вашем элементе управления? Здесь вы можете делать все, что вам нравится, внутри метода, который использует таймер Генделя.Тикайте, и таймер может быть остановлен в любое время, когда вы хотите ...

Dave Kreskowiak

Как остановить "асинхронное ожидание"? Вы не. Вы не понимаете понятия асинхронности и ожидания.

Для этого вы должны использовать таймер, а не Задачу.

1 Ответов

Рейтинг:
5

Richard Deeming

Использовать CancellationTokenSource[^] и А CancellationToken[^]:

Private _cts As CancellationTokenSource

Private Async Function Flash(ByVal token As CancellationToken) As Task
    While Not token.IsCancellationRequested
        Await Task.Delay(100, token)
        Label1.Visible = Not Label1.Visible
    End While
End Function

Private Async Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim newSource As New CancellationTokenSource()
    Dim oldSource As CancellationTokenSource = Interlocked.Exchange(_cts, newSource)
    If oldSource IsNot Nothing Then oldSource.Cancel()
    
    button1.Enabled = False
    button2.Enabled = True
    Try
        Await Flash(newSource.Token)
    Finally
        Interlocked.Exchange(_cts, Nothing)
        button2.Enabled = False
        button1.Enabled = True
    End Try
End Sub

Private Sub button2_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim cts As CancellationTokenSource = Interlocked.Exchange(_cts, Nothing)
    If cts IsNot Nothing Then cts.Cancel()
End Sub


Dave Kreskowiak

Это чертова тонна кода, чтобы заставить этикетку мигать. :)

Richard Deeming

Я рассматривал его как универсальный "как остановить асинхронность / ожидание", вместо того чтобы "как лучше всего заставить этикетку мигать". :)

Dave Kreskowiak

Наверное, из-за тебя у него тоже взорвалась голова. :)