【发布时间】:2018-04-21 07:35:34
【问题描述】:
我的项目中有一个 BackgroundWorker,我想用一个方法重新启动它。但是,当我使用CancelAsync() 方法,然后立即使用RunWorkerAsync() 方法时,取消尚未完成,BackgroundWorker 的 2 个实例已启动并引发 InvalidOperationException。为了解决这个问题,我使方法异步(它是一个 Sub 方法)并等待 CancelAsync() 等待它完成。但是,这会返回表达式不产生值的错误。是调用还是worker的方法造成的?
工人方法:
Private Sub GIFworker(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bkwGIF.DoWork
Dim hum As Integer = e.Argument
If hum Mod 2 = 1 Then
While bkwGIF.CancellationPending = False
pbxRpsHum.Image = ilRPS.Images(0)
Thread.Sleep(1000)
pbxRpsHum.Image = ilRPS.Images(1)
Thread.Sleep(1000)
End While
Else
While bkwGIF.CancellationPending = False
pbxRpsHum.Image = ilRPS.Images(0)
Thread.Sleep(1000)
pbxRpsHum.Image = ilRPS.Images(3)
Thread.Sleep(1000)
End While
End If
End Sub
调用CancelAsync()(哼是整数):
Await bkwGIF.CancelAsync()
bkwGIF.RunWorkerAsync(hum)
【问题讨论】:
-
BackgroundWorker 仍将控制权传递给 RunworkerCompleted 事件。将 Cancelled 的结果设置为 0 之类的值,然后在 RunWorkerCompleted 事件中检查结果并从那里重新启动 backgroundworker。
-
您需要阅读
BackgroundWorker课程。CancelAsync不可等待。它是旧异步模式的一部分。 -
@F0r3v3r-A-N00b,这不是这样做的方法。如果您在
DoWork事件处理程序中检测到CancellationPending是True,并且您确实取消了工作,则应该将e.Cancel设置为True。然后您可以在RunWorkerCompleted事件处理程序中检查e.Cancelled,它也将是True。 -
哦,好的。不知道 e.Cancelled 部分。谢谢
标签: vb.net winforms async-await backgroundworker