using System;
using System.Threading;
namespace Recetas.Cap04
{
public class AsyncDemo
{
string LongRunningMethod (int iCallTime, out int iExecThread)
{
Thread.Sleep (iCallTime) ;
iExecThread = AppDomain.GetCurrentThreadId ();
return "MyCallTime was " + iCallTime.ToString() ;
}
delegate string MethodDelegate(int iCallTime, out int iExecThread) ;
public void DemoCallback()
{
MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ;
string s ;
int iExecThread;
// Create the callback delegate.
AsyncCallback cb = new AsyncCallback(MyAsyncCallback);
// Initiate the Asynchronous call passing in the callback delegate
// and the delegate object used to initiate the call.
IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt);
}
public void MyAsyncCallback(IAsyncResult ar)
{
string s ;
int iExecThread ;
// Because you passed your original delegate in the asyncState parameter
// of the Begin call, you can get it back here to complete the call.
MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;
// Complete the call.
s = dlgt.EndInvoke (out iExecThread, ar) ;
Console.WriteLine (string.Format ("The delegate call returned the string: \"{0}\", and the number {1}", s, iExecThread.ToString() ) );
}
static void Main(string[] args)
{
AsyncDemo ad = new AsyncDemo () ;
ad.DemoCallback() ;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwoKbmFtZXNwYWNlIFJlY2V0YXMuQ2FwMDQKewoJcHVibGljIGNsYXNzIEFzeW5jRGVtbwoJewoJCXN0cmluZyBMb25nUnVubmluZ01ldGhvZCAoaW50IGlDYWxsVGltZSwgb3V0IGludCBpRXhlY1RocmVhZCkKCQl7CgkJCVRocmVhZC5TbGVlcCAoaUNhbGxUaW1lKSA7CgkJCWlFeGVjVGhyZWFkID0gQXBwRG9tYWluLkdldEN1cnJlbnRUaHJlYWRJZCAoKTsKCQkJcmV0dXJuICJNeUNhbGxUaW1lIHdhcyAiICsgaUNhbGxUaW1lLlRvU3RyaW5nKCkgOwoJCX0KCgkJZGVsZWdhdGUgc3RyaW5nIE1ldGhvZERlbGVnYXRlKGludCBpQ2FsbFRpbWUsIG91dCBpbnQgaUV4ZWNUaHJlYWQpICA7CgkJCgkJcHVibGljIHZvaWQgRGVtb0NhbGxiYWNrKCkKCQl7CgkJCU1ldGhvZERlbGVnYXRlIGRsZ3QgPSBuZXcgTWV0aG9kRGVsZWdhdGUgKHRoaXMuTG9uZ1J1bm5pbmdNZXRob2QpIDsKCQkJc3RyaW5nIHMgOwoJCQlpbnQgaUV4ZWNUaHJlYWQ7CgoJCQkvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGRlbGVnYXRlLgoJCQlBc3luY0NhbGxiYWNrIGNiID0gbmV3IEFzeW5jQ2FsbGJhY2soTXlBc3luY0NhbGxiYWNrKTsKCgkJCS8vIEluaXRpYXRlIHRoZSBBc3luY2hyb25vdXMgY2FsbCBwYXNzaW5nIGluIHRoZSBjYWxsYmFjayBkZWxlZ2F0ZQoJCQkvLyBhbmQgdGhlIGRlbGVnYXRlIG9iamVjdCB1c2VkIHRvIGluaXRpYXRlIHRoZSBjYWxsLgoJCQlJQXN5bmNSZXN1bHQgYXIgPSBkbGd0LkJlZ2luSW52b2tlKDMwMDAsIG91dCBpRXhlY1RocmVhZCwgY2IsIGRsZ3QpOyAKCQl9CgoJCXB1YmxpYyB2b2lkIE15QXN5bmNDYWxsYmFjayhJQXN5bmNSZXN1bHQgYXIpCgkJewoJCQlzdHJpbmcgcyA7CgkJCWludCBpRXhlY1RocmVhZCA7CgoJCQkvLyBCZWNhdXNlIHlvdSBwYXNzZWQgeW91ciBvcmlnaW5hbCBkZWxlZ2F0ZSBpbiB0aGUgYXN5bmNTdGF0ZSBwYXJhbWV0ZXIKCQkJLy8gb2YgdGhlIEJlZ2luIGNhbGwsIHlvdSBjYW4gZ2V0IGl0IGJhY2sgaGVyZSB0byBjb21wbGV0ZSB0aGUgY2FsbC4KCQkJTWV0aG9kRGVsZWdhdGUgZGxndCA9IChNZXRob2REZWxlZ2F0ZSkgYXIuQXN5bmNTdGF0ZTsKCgkJCS8vIENvbXBsZXRlIHRoZSBjYWxsLgoJCQlzID0gZGxndC5FbmRJbnZva2UgKG91dCBpRXhlY1RocmVhZCwgYXIpIDsKCgkJCUNvbnNvbGUuV3JpdGVMaW5lIChzdHJpbmcuRm9ybWF0ICgiVGhlIGRlbGVnYXRlIGNhbGwgcmV0dXJuZWQgdGhlIHN0cmluZzogXCJ7MH1cIiwgYW5kIHRoZSBudW1iZXIgezF9IiwgcywgaUV4ZWNUaHJlYWQuVG9TdHJpbmcoKSApICk7CgkJfQoJCQoJCXN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKCQl7CgkJCUFzeW5jRGVtbyBhZCA9IG5ldyBBc3luY0RlbW8gKCkgOwoJCQlhZC5EZW1vQ2FsbGJhY2soKSA7CgkJfQoJfQp9