I'm trying to find a memory leak in my application and I want to know if I must (or should) call EndInvoke in case of a timeout. I'm calling a external system and I must have a way to stop waiting if execution is too long:
Dim ar As IAsyncResult
Try
  ar = deleg.BeginInvoke(Nothing, New Object)
  If Not ar.AsyncWaitHandle.WaitOne(getTimeout, False) Then
    'Should I call EndIn开发者_如何学JAVAvoke here
    Throw New Exceptions.TimeoutException
  Else
    response = deleg.EndInvoke(ar)
  End If
Finally
  ar = Nothing
End Try
Thanks
Yes, you do need to call EndInvoke. But you can't call it in a timeout situation (or else it would block on the operation, defeating the purpose of asynchronous execution and timeouts).
One option is to toss it into the thread pool. You can pass the AsyncWaitHandle to ThreadPool.RegisterWaitForSingleObject and have the callback call EndInvoke (being sure to catch exceptions). However, this approach does not scale (only 64 handles can be outstanding on the thread pool at any given time).
A better option is to use the new Task abstraction in .NET 4.0 (also available in .NET 3.5 if you use Rx). It's much easier to work with.
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论