我正在學習線程。我的意圖是將一些值傳遞給一個計算方法,如果結果將不會在20毫秒內返回,我會報告「操作超時」。基於我的內容,我已經實現了代碼如下:如何在異步調用中報告超時?
public delegate long CalcHandler(int a, int b, int c);
public static void ReportTimeout()
{
CalcHandler doCalculation = Calculate;
IAsyncResult asyncResult =
doCalculation.BeginInvoke(10,20,30, null, null);
if (!asyncResult.AsyncWaitHandle.WaitOne(20, false))
{
Console.WriteLine("..Operation Timeout...");
}
else
{
// Obtain the completion data for the asynchronous method.
long val;
try
{
val= doCalculation.EndInvoke(asyncResult);
Console.WriteLine("Calculated Value={0}", val);
}
catch
{
// Catch the exception
}
}
}
public static long Calculate(int a,int b,int c)
{
int m;
//for testing timeout,sleep is introduced here.
Thread.Sleep(200);
m = a * b * c;
return m;
}
問題:
(1)是否有報告超時的正確方法? (2)如果時間到了,我不會調用EndInvoke()。在這種情況下調用EndInvoke()是強制性的嗎?
(3)我聽說
「即使你不想處理您的異步方法的返回值,你應該調用EndInvoke;否則,你可能每次啓動時泄漏內存使用BeginInvoke進行異步調用「
與內存相關的風險是什麼?你能舉個例子嗎?