public class AsyncDemo {
private delegate string RunDelegate();
private string _name; private RunDelegate _del;
public AsyncDemo(string name) { _name = name; _del = Run; }
public string Run() => "My name is " + _name;
public IAsyncResult BeginRun(AsyncCallback cb, object state) => _del.BeginInvoke(cb, state);
public string EndRun(IAsyncResult ar) => _del.EndInvoke(ar);
}
var demo = new AsyncDemo("jiangnii");
IAsyncResult ar = demo.BeginRun(null, null);
// 做其他事...
string result = demo.EndRun(ar); // 這裡阻塞直到完成
Console.WriteLine(result);
while (!ar.IsCompleted) { Console.Write("."); /* 做其他事 */ }
string result = demo.EndRun(ar); // 立即返回
ar.AsyncWaitHandle.WaitOne(1000, false); // 最多等 1 秒
if (ar.IsCompleted) Console.WriteLine(demo.EndRun(ar));
else Console.WriteLine("逾時未完成");
static AsyncDemo demo = new AsyncDemo("jiangnii");
static void Main() {
bool state = false;
demo.BeginRun(Callback, state);
Thread.Sleep(1000); // 等待回調完成 (實際應用用 ManualResetEvent 等)
}
static void Callback(IAsyncResult ar) {
bool state = (bool)ar.AsyncState;
string result = demo.EndRun(ar);
Console.WriteLine(state ? result : result + ", isn't it?");
}
任何同步方法皆可透過委派 BeginInvoke/EndInvoke 非同步化,無需類別自行實作 BeginXxx/EndXxx。