天天看點

C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式

在程式設計的過程中,我們會遇到很多需要異步操作的場景。比如要下載下傳一個檔案,如果使用同步的方式進行下載下傳,那麼UI操作就會被卡住,這時最好能夠使用異步的方式進行下載下傳。在C#中,很早就開始支援異步的操作了,隻不過早期的方法寫起來有些麻煩。到了C# 5.0的時候,直接添加了兩個關鍵字:async 和 await,這下對異步操作的支援可謂是達到了完美。下面我們就通用一個簡單的 demo 看一下它們的基本用法。

我們先看看用同步的方式下載下傳一個檔案:

C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式
C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式

在執行 DownloadFile 方法的過程中,UI線程被卡死,整個的下載下傳過程中應用程式都處于沒響應的狀态。這當然是不能接受的,是以我們應該使用下面的異步方式進行檔案的下載下傳。

我們先看一下使用早期的異步代碼去下載下傳檔案:

C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式
C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式

好吧,事情變得稍微有點複雜了。一個簡單的下載下傳邏輯居然被分隔到了兩個方法中!在第一個方法中挂載 DownloadFileCompleted 事件,然後啟動下載下傳。下載下傳完成後通過 DownloadFileCompleted 事件處理函數進行通知。如果您能夠習慣于這樣的寫法,其實C# 早期提供的異步程式設計接口已經足夠用了,因為這也正是異步操作真正的實作方式。

但是,作為程式員,我們是不會滿足的,永遠不會…

在C# 5.0 中引入了 async 和 await 關鍵字,它們使得異步操作的實作更加簡單、容易!

C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式
C# 異步操作 async await下載下傳一個檔案異步下載下傳檔案async await 方式

注意代碼中 async 和 await 關鍵字的位置,這樣代碼就是以異步方式去執行下載下傳邏輯,整個過程中UI 操作不會被阻塞掉。是不是很神奇呢?

這段代碼最大的魔力在于它和同步下載下傳檔案的代碼幾乎相同!每個 人都喜歡寫順序執行的代碼,這樣的代碼邏輯也最清晰。async 和 await 的最大優勢就是把人腦感覺簡單的代碼轉換為真正的異步操作邏輯。

本文轉自sparkdev部落格園部落格,原文連結:http://www.cnblogs.com/sparkdev/p/5938165.html,如需轉載請自行聯系原作者