I have the following code:
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()); }
I thought the res.AsyncState would return the string, passed as the last argument in the call to BeginInvoke, but it’s null. Does anybody know why?
PS, I know I could pass the del as the last argument in BeginInvoke and then call EndInvoke in the callback, to get some result from the doStuff method, — or I could just get the string val from the class! — but I am surpised that the AsyncState on the AsyncResult object is null…
The value of
ar.AsyncStateis the value of result when you originally pass it toBeginInvoke. The fact that when you passed it, you used the value ofresultdoesn’t mean that it’s ‘bound’ to the result variable. It’s just the value of theresultvariable when you pass it to start with.To see this, either set
resultto some test value before callingBeginInvoke, or just pass a string literal instead. Either way, you’ll get that value in the callback.On the other hand, your callback and original delegate both have the same target object, so you could use use
resultwithin the callback and it would have the value you want – that’s another way of maintaining state.