我的问题涉及VB .NET中的异步操作。
鉴于以下内容:
Delegate WorkerDelegate(Byval asyncOp As AsyncOperation)
Public Sub StartWork()
Dim worker as new WorkerDelegate(AddressOf DoWork)
Dim asyncOp as AsyncOperation = AsyncOperationManager.CreateOperation(New Object)
// begin work on different thread
worker.BeginInvoke(asyncOp, Nothing, Nothing)
End Sub
Private Sub DoWork(Byval asyncOp as AsyncOperation)
// do stuff
// work finished, post
asyncOp.PostOperationCompleted(AddressOf OnDownloadFinished, Nothing)
End Sub
Private Sub OnDownloadFinished()
// Back on the main thread now
End Sub
我读过的大多数资源都说如果你在委托上使用BeginInvoke,你必须调用EndInvoke。在上面的示例中,我使用PostOperationCompleted方法将线程切换回来并报告操作已完成。
当我调用worker.BeginInvoke并在OnDownloadFinished方法中添加worker.EndInvoke时,是否仍需要获取IAsyncResult?
答案 0 :(得分:1)
调用EndInvoke是最佳做法,因为这是在清理AsyncResult分配的资源时。
但是,如果您不访问WaitHandle属性,则AFAIK异步委托使用的异步结果不使用任何资源,因此不调用EndInvoke可能没有任何影响。
在您的方案中,您应该考虑使用ThreadPool.QueueUserWorkItem。
答案 1 :(得分:0)
在example on MSDN中,您OnDownloadFinished
方法的等效内容如下所示:
// This method is invoked via the AsyncOperation object,
// so it is guaranteed to be executed on the correct thread.
private void CalculateCompleted(object operationState)
{
CalculatePrimeCompletedEventArgs e =
operationState as CalculatePrimeCompletedEventArgs;
OnCalculatePrimeCompleted(e);
}
它不会调用EndInvoke()
。因此可以安全地假设不在EndInvoke()
处理程序中调用PostOperationCompleted
是正常的。