J'apprends le threading.Mon intension est de passer certaines valeurs à une méthode de calcul, si le résultat ne sera pas retourné dans les 20 ms, je rapporterai "Operation timeout" .Basé sur mon understading j'ai implémenté le code comme suit :Comment signaler un délai d'attente dans un appel asynchrone?
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;
}
questions:
(1) Est-ce la bonne façon de signaler délai d'attente? (2) Je n'appellerai pas EndInvoke(), si le temps est expiré. Dans ce cas, appeler EndInvoke() est obligatoire?
(3) J'entendu que
« Même si vous ne voulez pas gérer la valeur de retour de votre méthode asynchrone, vous devez appeler EndInvoke, sinon, vous risquez une fuite mémoire chaque fois que vous effectuez un appel asynchrone utilisant BeginInvoke "
Quel est le risque associé à la mémoire? peux-tu donner un exemple?