除.NET事件外,.NET Framework中還存在其他異步數(shù)據(jù)源。 其中之一是異步方法模式。 在該設(shè)計(jì)模式中,提供了兩種方法。 一個(gè)方法(通常命名為BeginX)用于啟動(dòng)計(jì)算并返回一個(gè)IAsyncResult句柄,該句柄傳遞給第二個(gè)方法(通常稱為EndX),然后檢索計(jì)算結(jié)果。 完成通常通過(guò)實(shí)現(xiàn)AsyncCallback委托或輪詢IAsyncResult.IsCompleted來(lái)發(fā)出信號(hào)。 代碼堅(jiān)持這種模式往往難以閱讀和維護(hù)。 在本主題中,我們將演示如何使用Rx工廠方法將這些異步數(shù)據(jù)源轉(zhuǎn)換為可觀察的序列。
.NET中的許多異步方法都使用像BeginX和EndX這樣的簽名來(lái)編寫,其中X是異步執(zhí)行的方法名。 BeginX使用參數(shù)來(lái)執(zhí)行該方法,一個(gè)AsyncCallback是一個(gè)動(dòng)作,它接受一個(gè)I??AsyncResult并不返回任何東西,最后是一個(gè)對(duì)象狀態(tài)。 EndX接受從AsyncCallback傳入的IAsyncResult,以檢索異步調(diào)用的值。 Observable類型的FromAsyncPattern運(yùn)算符包裝Begin和End方法(作為參數(shù)傳遞給運(yùn)算符),并返回一個(gè)與Begin相同的參數(shù)并返回一個(gè)observable的函數(shù)。這個(gè)observable表示發(fā)布單個(gè)值的序列,這是您剛才指定的調(diào)用的異步結(jié)果。 在下面的示例中,我們將使用IAsyncResult模式將Stream對(duì)象的BeginRead和EndRead轉(zhuǎn)換為返回可觀察序列的函數(shù)。對(duì)于FromAsyncPattern運(yùn)算符的通用參數(shù),我們指定BeginRead的參數(shù)的類型,直到回調(diào)。由于EndRead方法返回一個(gè)值,我們將這個(gè)類型作為FromAsyncPattern的最終通用參數(shù)。如果將鼠標(biāo)懸停在var上進(jìn)行讀取,您會(huì)注意到,F(xiàn)romAsyncPattern的返回值是一個(gè)具有以下簽名的函數(shù)委托:Func
Stream inputStream = Console.OpenStandardInput();var read = Observable.FromAsyncPattern<byte[], int, int, int>(inputStream.BeginRead, inputStream.EndRead);byte[] someBytes = new byte[10];IObservable<int> source = read(someBytes, 0, 10);IDisposable subscription = source.Subscribe( x => Console.WriteLine("OnNext: {0}", x), ex => Console.WriteLine("OnError: {0}", ex.Message), () => Console.WriteLine("OnCompleted"));Console.ReadKey();新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注