我正在学习线程。我的意图是将一些值传递给一个计算方法,如果在 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 启动异步调用时,您都有可能泄漏内存”
与记忆相关的风险是什么?你能举个例子吗?