首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 非同步程式設計基礎(一·完):四種非同步呼叫模式完整實戰

     編輯:關於C語言

測試用非同步元件

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);
}

模式 1:Begin → 執行其他工作 → End (阻塞等待完成)

var demo = new AsyncDemo("jiangnii");
IAsyncResult ar = demo.BeginRun(null, null);
// 做其他事...
string result = demo.EndRun(ar); // 這裡阻塞直到完成
Console.WriteLine(result);

模式 2:輪詢 IsCompleted

while (!ar.IsCompleted) { Console.Write("."); /* 做其他事 */ }
string result = demo.EndRun(ar); // 立即返回

模式 3:AsyncWaitHandle 等待 (可設定逾時)

ar.AsyncWaitHandle.WaitOne(1000, false); // 最多等 1 秒
if (ar.IsCompleted) Console.WriteLine(demo.EndRun(ar));
else Console.WriteLine("逾時未完成");

模式 4:回調函數 + 狀態物件 (最彈性)

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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved