2011-09-09 93 views
1

我試圖找到我的應用程序中的內存泄漏,我想知道如果我必須(或應該)在超時情況下調用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

是的,你確實需要調用EndInvoke。但是你不能在超時情況下調用它(否則它會阻止這個操作,破壞異步執行和超時的目的)。

一種選擇是將它折入線程池。您可以將AsyncWaitHandle傳遞給ThreadPool.RegisterWaitForSingleObject並將回撥呼叫EndInvoke(肯定會發現異常)。但是,這種方法不能擴展(在任何給定的時間,只有64個句柄可以在線程池中處於未完成狀態)。

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

+0

感謝您的回答。不幸的是,我使用的服務器是.Net 3.5,我無法升級到.NET 4.0或在其上安裝任何軟件包(例如Rx擴展)。你知道只有.NET 3.5才能做到這一點嗎?另外,你說我在ThreadPool中只能有64個句柄。你是否同時意味着64個手柄?當線程完成(或超時)時,是否釋放了句柄? –

+0

Rx不需要安裝 - 它可以僅在bin運行時運行。除了Rx AFAIK之外,還沒有3.5的「Task」實現。 64-句柄限制適用於'RegisterWaitForSingleObject',所以它限制了已經超時但尚未完成的異步委託的數量。 –

+0

我們最終將項目的這一部分轉換爲.Net 4,以便我可以使用這些任務。感謝你的回答。 –