.NET End Invoke / Post操作已完成

时间:2009-11-20 22:33:52

标签: vb.net multithreading asynchronous

我的问题涉及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?

2 个答案:

答案 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是正常的。