天天看點

C#将Begin和End異步方法轉task異步

title

author

date

CreateTime

categories

C# 将 Begin 和 End 異步方法轉 task 異步

lindexi

2019-08-31 16:55:58 +0800

2019-05-15 14:13:35 +0800

C#

在 .NET Framework 有兩個不同的異步方法,一個是 Asynchronous Programming Model (APM) 另一個是 Task-based asynchronous pattern (TAP) 說 APM 和 TAP 估計大家都不認識。其實 APM 就是有成對的 Begin 和 End 方法的異步,而 TAP 就是使用 async 和 await 的異步

從代碼上看,使用 async 和 await 的方法比較清真,那麼如何從古老的 begin 和 end 異步方法轉 task 的異步方法?

在 Task 的 Factory 提供了 FromAsync 方法讓大家可以将 Begin 和 End 異步方法轉 task 異步,但是這個方法參數很多

在 Begin 的方法裡面一般都是這樣寫的

在 End 的方法一般都是這樣寫的

先調用 Begin 方法傳入參數,拿到了 IAsyncResult 用于傳入 EndFoo 作為參數,同時在 AsyncCallback 可以傳入方法完成的方法

在 FromAsync 寫起來是相反的,首先需要知道 End 方法的傳回值,下面使用 FileStream 作為例子,如 EndRead 是傳回 int 可以使用 Task<int> 的方法

這樣就可以拿到 EndRead 的傳回值

在 FromAsync 的第一個參數傳入的是 BeginRead 方法,第二個參數是 EndRead 方法,然後加上的 BeginRead 方法需要傳入的參數,傳入除了 AsyncCallback 之外的其他參數,請看下面代碼

也就是有 IAsyncResult BeginFoo(參數 參數1, 參數 參數2..., AsyncCallback asyncCallback, object state) 這個方法,那麼在轉 async 和 await 異步,可以使用下面代碼

Asynchronous Programming Model (APM)

Task-based Asynchronous Pattern (TAP)