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

淺談 .NET 多線程與並行計算(十):.NET 異步編程模型基礎(上)

     編輯:關於ASP.NET

多線程的兩大優勢:並行運算與異步操作

多線程可發揮多核心效能(並行運算),亦能讓長時間操作獨立執行不阻塞主線程(異步操作)。前者利用多核提升效能,後者避免 CPU 空等待。廣義上異步亦屬並行一種。

四種常見異步應用模式

  1. 新線程執行任務,主線程做其他事後等待結果
  2. 新線程執行任務,主線程輪詢是否完成,可選擇等待或繼續其他操作
  3. 新線程執行任務,完成後立即執行回呼更新狀態,主線程與工作線程無直接互動
  4. 新線程執行任務,完成後不做任何事(Fire-and-forget)

補充:異步不一定依賴線程,使用佇列異步處理資料亦屬異步模式。

手寫線程池實現模式 1 的範例

class AsyncObj
{
    public EventWaitHandle AsyncWaitHandle { get; set; }
    public object Result { get; set; }

    public AsyncObj()
    {
        AsyncWaitHandle = new AutoResetEvent(false);
    }
}

AsyncObj ao = new AsyncObj();
ThreadPool.QueueUserWorkItem(state =>
{
    AsyncObj obj = state as AsyncObj;
    Console.WriteLine("async operation started @ " + DateTime.Now.ToString("mm:ss"));
    Thread.Sleep(2000);
    Console.WriteLine("async operation completed @ " + DateTime.Now.ToString("mm:ss"));
    obj.Result = 100;
    obj.AsyncWaitHandle.Set();
}, ao);

Console.WriteLine("main operation started @ " + DateTime.Now.ToString("mm:ss"));
Thread.Sleep(1000);
Console.WriteLine("main operation completed @ " + DateTime.Now.ToString("mm:ss"));
ao.AsyncWaitHandle.WaitOne();
Console.WriteLine("get async operation result : " + ao.Result.ToString() + " @ " + DateTime.Now.ToString("mm:ss"));

執行結果圖示

輸出顯示主線程與工作線程交錯執行,主線程在 WaitOne() 處阻塞直到工作線程 Set() 釋放信號。

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