je le code suivant:Passage de données dans une méthode de rappel (via BeginInvoke) en C#
delegate int doStuffDel(int instanceNo, int sleepTime, int repeatCount);
string result;
private int doStuff(int instanceNo, int sleepTime, int repeatCount)
{
for (int i = 0; i < repeatCount; i++)
{
Console.Write(instanceNo);
Thread.Sleep(sleepTime);
}
result = instanceNo + " repeated " + repeatCount;
return instanceNo;
}
private void button3_Click(object sender, EventArgs e)
{
doStuffDel del = doStuff;
IAsyncResult ar = del.BeginInvoke(3, 120, 50, finishedCallback, result);
}
private void finishedCallback(IAsyncResult ar)
{
Console.WriteLine("Done. The result was " + ar.AsyncState.ToString());
}
Je pensais que le res.AsyncState retournerait la chaîne, passé comme dernier argument dans l'appel à BeginInvoke, mais c'est nul. Est-ce que quelqu'un sait pourquoi? PS, je sais que je pourrais passer le del comme dernier argument dans BeginInvoke et ensuite appeler EndInvoke dans le rappel, pour obtenir un résultat de la méthode doStuff, - ou je pourrais juste obtenir la chaîne val de la classe! - mais je suis surpris que l'AsyncState sur l'objet AsyncResult soit nul ...
Appelez toujours EndInvoke sur un IAsyncResult, sinon vous risquez de perdre des ressources non gérées (événements). –