Mam następujący kod:Przekazywanie danych do metody wywołania zwrotnego (za pośrednictwem BeginInvoke) w 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());
}
Myślałem, że res.AsyncState zwróci ciąg, przekazany jako ostatni argument w wywołaniu BeginInvoke, ale jest zerowy. Czy ktoś wie dlaczego?
PS, Wiem, że mogłem przekazać del jako ostatni argument w BeginInvoke, a następnie wywołać EndInvoke w wywołaniu zwrotnym, aby uzyskać wynik z metody doStuff, - lub mógłbym uzyskać ciąg znaków val z klasy! - ale jestem zaskoczony, że AsyncState na obiekcie AsyncResult jest pusty ...
Zawsze wywołuj EndInvoke na IAsyncResult, w przeciwnym razie możesz przeciekać niezarządzane zasoby (zdarzenia). –