using System;
using System.Threading;
class Program{
delegate void SomeDelegate();
static SomeDelegate method;
static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(){
method = new SomeDelegate(SendEmail);
method.BeginInvoke(null, new AsyncCallback(SendEmailCallback));
Console.WriteLine("Program continues");
mre.WaitOne();
Console.WriteLine("Program ended");
}
static void SendEmail()
{
Console.WriteLine("Sending email");
Thread.Sleep(1000);
}
static void SendEmailCallback(IAsyncResult ar){
method.EndInvoke(ar);
Console.WriteLine("email sent");
mre.Set();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwoKY2xhc3MgUHJvZ3JhbXsKICAgIAogICAgZGVsZWdhdGUgdm9pZCBTb21lRGVsZWdhdGUoKTsKICAgIHN0YXRpYyBTb21lRGVsZWdhdGUgbWV0aG9kOwogICAgc3RhdGljIE1hbnVhbFJlc2V0RXZlbnQgbXJlID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOwogICAgCiAgICBzdGF0aWMgdm9pZCBNYWluKCl7CiAgICAgICAgbWV0aG9kID0gbmV3IFNvbWVEZWxlZ2F0ZShTZW5kRW1haWwpOwogICAgICAgIAogICAgICAgIG1ldGhvZC5CZWdpbkludm9rZShudWxsLCBuZXcgQXN5bmNDYWxsYmFjayhTZW5kRW1haWxDYWxsYmFjaykpOwogICAgICAgIAogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJQcm9ncmFtIGNvbnRpbnVlcyIpOwogICAgICAgIAogICAgICAgIG1yZS5XYWl0T25lKCk7CiAgICAgICAgCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlByb2dyYW0gZW5kZWQiKTsKICAgIH0KICAgIAogICAgc3RhdGljIHZvaWQgU2VuZEVtYWlsKCkKICAgIHsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2VuZGluZyBlbWFpbCIpOwogICAgICAgIFRocmVhZC5TbGVlcCgxMDAwKTsKICAgIH0KICAgIHN0YXRpYyB2b2lkIFNlbmRFbWFpbENhbGxiYWNrKElBc3luY1Jlc3VsdCBhcil7CiAgICAgICAgbWV0aG9kLkVuZEludm9rZShhcik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImVtYWlsIHNlbnQiKTsKICAgICAgICBtcmUuU2V0KCk7CiAgICB9Cn0=