委託的Invoke是同步調用,等價於直接使用()來執行。異步
BeginInvoke是異步調用,BeginInvoke直接返回,EndInvoke阻塞直到委託執行結束。spa
下面這段代碼能夠很清晰的把這幾個方法描述清楚:code
// 定義一個委託 Func<string, string> f = new Func<string, string>((s)=> { for (int i = 0; i <= 100; i += 10) { Thread.Sleep(200); } return "ThreadId: " + Thread.CurrentThread.ManagedThreadId + " - ActionResult: " + s; }); // 阻塞方式執行,下面兩種調用方式是等價的 string r1 = f("A"); string r2 = f.Invoke("A"); MessageBox.Show(r1 + " - " + r2); AsyncCallback callback = new AsyncCallback((iar) => { // 經過f.EndInvoke(ar)得到委託的返回值 // 若是不能經過上下文得到f,也能夠這樣得到:(Func<string, string>)(iar as AsyncResult).AsyncDelegate // iar.AsyncState是BeginInvoke調用時傳入的@object參數 MessageBox.Show(f.EndInvoke(iar) + " - " + iar.AsyncState); }); // BeginInvoke調用當即返回 IAsyncResult result = f.BeginInvoke("for delegate", callback, "for callback"); // 查詢異步調用是否結束,結束時callback同時被調用 // 超時返回false,調用結束返回true int timeOutCount = 0; while (!result.AsyncWaitHandle.WaitOne(10)) { timeOutCount++; } MessageBox.Show("超時次數:" + timeOutCount);