首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免异步超时时的内存泄漏

避免异步超时时的内存泄漏
EN

Stack Overflow用户
提问于 2011-09-10 03:50:52
回答 1查看 481关注 0票数 1

我正在尝试查找应用程序中的内存泄漏,我想知道在超时的情况下是否必须(或应该)调用EndInvoke。我正在调用一个外部系统,如果执行时间太长,我必须有一种停止等待的方法:

代码语言:javascript
复制
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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-10 06:35:46

是的,您确实需要调用EndInvoke。但是你不能在超时的情况下调用它(否则它会阻塞操作,违背异步执行和超时的目的)。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7366734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档