C# 非同步程式設計

讓程式的使用體驗變得更好

Image Powered by DALLE

前言

同步與非同步這個議題,困擾我非常久,再加上大學時沒太多機會處理到非同步的程式,第一次接觸到非同步是在做一個畫面點擊事件,才慢慢了解非同步大概是什麼。

這篇文章透過 C# 程式,來探討非同步程式設計。

非同步運算

如果我們以同步的方式存取資料,我們會先跟資料庫撈取資料,我們會需要等到資料撈取完顯示在畫面上,才可進行下一個動作,也就是說,當此任務沒完成時,在此之後的所有任務無法執行,在使用體驗是非常糟糕的。

而非同步,即便讀取資料時需要時間,在等待的時間,畫面依舊可以處理其他事情,等資料讀取完畢時,我們再處理,不會阻礙到其他與此無關的任務。

沒有實作非同步運算會造成的結果是,一個工作在執行時,會為了等他把一件事情做完才能繼續往下做。

非同步運算接收到需求,不用一直等到需求完成再執行其他需求,兩者的差別在於:發送需求的人是否需要等到需求完成才可以執行其他事情。

非同步運算 vs 平行運算

非同步運算是在事情好了之後會通知人的事件,平行運算是可以同時做很多事,例如準備早餐時,同時煮蛋、培根,設立不同時間提醒哪個時才可以起鍋,然後在完成鬧鐘設立之後,清理廚房直到鬧鐘響起。

非同步的程式碼範例

首先,我想要展示一下同步的程式碼:

public string GetDataFromDatabase()
{
// 假設這是一個從資料庫 get data 的運作
Thread.Sleep(5000);
return "Database data";
}

在同步的情況下,我們必須等待程式裡面的 Thread.sleep 執行完畢後才會回傳資料。這樣的情況下畫面就會凍結住,必須等待結果完成,畫面才會更新。

而在非同步的世界裡面,就不是這樣了。在 C# 中,非同步程式設計常常是透過 asyncawait 關鍵字來實現程式的邏輯。

public async Task<string> GetDataFromDatabaseAsync()
{
// 使用 Task.Delay 來模擬非同步的資料庫運作
await Task.Delay(5000);
return "Database data";
}

在這個範例中,GetDataFromDatabaseAsync 會立即回傳一個 Task<string>,而不會使 function caller 等待 function 運作完畢才往下執行。當資料庫運作完成後,這個 function 才會回傳結果。在這樣的狀況下,我們按下一個按鈕時,畫面不會凍結著,我們依舊可以繼續使用程式,當非同步的運算結果完成的時候,畫面一樣會更新。

這兩段程式碼的展示,我想就可以讓大家體會到非同步程式設計的威力。

結論

如果你在程式中要處理長時間執行的 I/O 操作或網絡請求時,就可以使用非同步程式設計的概念。

--

--

(KJH) Kuan-Jung, Huang
(KJH) Kuan-Jung, Huang

Written by (KJH) Kuan-Jung, Huang

CTO at Metablox.co, Founder of AI Users Community in Taiwan

No responses yet