开发者

.NET End Invoke / Post Operation Completed

开发者 https://www.devze.com 2022-12-11 21:39 出处:网络
My question involves async operations in VB .NET. Given the following: Delegate WorkerDelegate(Byval asyncOp As AsyncOperation)

My question involves async operations in VB .NET.

Given the following:

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

Most resources I've read say 开发者_运维技巧that if you use BeginInvoke on a delegate you must call EndInvoke. In my example above I am using the PostOperationCompleted method to switch threads back and report the operation has finished.

Do I still need to get an IAsyncResult when I call worker.BeginInvoke and add worker.EndInvoke in the OnDownloadFinished method?


It's best practice to call EndInvoke, because that's when resources assigned by the AsyncResult are cleaned.

However, AFAIK the async result used by the asynchronous delegate does not use any resource if you don't access the WaitHandle property, so not calling the EndInvoke may have no impact.

In your scenario, you should consider using ThreadPool.QueueUserWorkItem.


In the example on MSDN, the equivalent of your OnDownloadFinished method looks like this:

// 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);
}

It does not call EndInvoke(). So it's safe to assume that not calling EndInvoke() in the PostOperationCompleted handler is alright.

0

精彩评论

暂无评论...
验证码 换一张
取 消