2009-11-20 4 views
0

В моем вопросе задействованы операции асинхронного ввода в VB .NET.Выполнение завершения/завершения транзакции .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 для переключения потоков назад и сообщения о завершении операции.

Должен ли я получить IAsyncResult, когда я вызываю worker.BeginInvoke и добавляет employee.EndInvoke в метод OnDownloadFinished?

ответ

1

Лучше всего называть EndInvoke, потому что тогда очищаются ресурсы, назначенные AsyncResult.

Однако AFAIK, результат асинхронной передачи, используемый асинхронным делегатом, не использует какой-либо ресурс, если вы не получаете доступ к свойству WaitHandle, поэтому не вызывающий EndInvoke может не иметь никакого влияния.

В вашем сценарии вы должны рассмотреть возможность использования ThreadPool.QueueUserWorkItem.

+0

+1 для QueueUserWorkItem. Используйте это, когда можете, сырые вызовы и потоки, когда нужно. –

+0

Согласитесь с QueueUserWorkItem, но бит об очистке ресурсов EndInvoke - это нонсенс. Вы можете вызвать EndInvoke для получения возвращаемого значения из делегата, если это необходимо, но это не требуется. – Andomar

+0

EndInvoke будет использовать IAsyncResult.WaitHandle, если к нему был осуществлен доступ. Доступ к WaitHandle и не вызов EndInvoke окажет давление на очередь финализации в сборщике мусора. –

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 в порядке.

+0

Я согласен с вашей логикой здесь (да, эта ссылка - это то, откуда я получил шаблон). Тем не менее, в тоннах примеров MSDN есть ошибки, которые указывают пользователи, не знал, не вызвал ли вызов EndInvoke контроль MS – 2009-11-20 23:14:08

Смежные вопросы