我正在尝试在我的应用程序中找到内存泄漏,我想知道是否必须(或应该)在超时的情况下调用EndInvoke。我正在调用外部系统,如果执行时间太长,我必须有办法停止等待:
Dim ar As IAsyncResult
Try
ar = deleg.BeginInvoke(Nothing, New Object)
If Not ar.AsyncWaitHandle.WaitOne(getTimeout, False) Then
'Should I call EndInvoke here
Throw New Exceptions.TimeoutException
Else
response = deleg.EndInvoke(ar)
End If
Finally
ar = Nothing
End Try
由于
答案 0 :(得分:0)
是的,您需要致电EndInvoke
。但是你不能在超时情况下调用它(否则它会阻塞操作,从而无法实现异步执行和超时的目的)。
一种选择是将其投入线程池。您可以将AsyncWaitHandle
传递给ThreadPool.RegisterWaitForSingleObject
并进行回调调用EndInvoke
(确保捕获异常)。但是,这种方法不能扩展(在任何给定时间,线程池中只有64个句柄可以是未完成的)。
更好的选择是在.NET 4.0中使用新的Task
抽象(如果使用Rx,也可以在.NET 3.5中使用)。使用起来要容易得多。