В моем вопросе задействованы операции асинхронного ввода в 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 для QueueUserWorkItem. Используйте это, когда можете, сырые вызовы и потоки, когда нужно. –
Согласитесь с QueueUserWorkItem, но бит об очистке ресурсов EndInvoke - это нонсенс. Вы можете вызвать EndInvoke для получения возвращаемого значения из делегата, если это необходимо, но это не требуется. – Andomar
EndInvoke будет использовать IAsyncResult.WaitHandle, если к нему был осуществлен доступ. Доступ к WaitHandle и не вызов EndInvoke окажет давление на очередь финализации в сборщике мусора. –