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)