避免异步超时时出现内存泄漏

时间:2011-09-09 19:50:52

标签: .net vb.net asynchronous

我正在尝试在我的应用程序中找到内存泄漏,我想知道是否必须(或应该)在超时的情况下调用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

由于

1 个答案:

答案 0 :(得分:0)

是的,您需要致电EndInvoke。但是你不能在超时情况下调用它(否则它会阻塞操作,从而无法实现异步执行和超时的目的)。

一种选择是将其投入线程池。您可以将AsyncWaitHandle传递给ThreadPool.RegisterWaitForSingleObject并进行回调调用EndInvoke(确保捕获异常)。但是,这种方法不能扩展(在任何给定时间,线程池中只有64个句柄可以是未完成的)。

更好的选择是在.NET 4.0中使用新的Task抽象(如果使用Rx,也可以在.NET 3.5中使用)。使用起来要容易得多。