Я изучаю многопоточность. Моя цель - передать некоторые значения методу для расчета, если результат не будет возвращен в течение 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»
Какой риск связан с памятью? Вы можете привести пример?