2010-09-07 84 views
17

我試圖以編程方式在C#4中鏈接異步操作,例如寫入給定的流對象。我原本是這樣做的「手動」,掛鉤從一個操作到下一個回調,但我想我會嘗試.NET 4任務並行庫,以節省自己重新發明併發輪的麻煩。如何使用.NET 4中的任務並行庫鏈接異步操作?

首先,我總結我的異步調用的任務,像這樣:

public static Task CreateWriteTask(Stream stream, byte[] data) 
{ 
    return Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null); 
} 

延續做出鏈同步操作非常簡單(如果你不介意的不幸方法名):

public static Task ChainFlush(Stream stream, Task precedingTask) 
{ 
    return precedingTask.ContinueWith(x => stream.Flush()); 
} 

但是沒有Task.ContinueWith方法的版本接受與TaskFactory.FromAsync相同的異步操作。

因此,假設我堅持使用第三方物流,我正在尋找正確的此方法的實現:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) 
{ 
    //? 
} 
+0

TaskCreationOptions.AttachedToParent? – 2011-10-10 19:42:44

回答

12

我的最好的辦法,到目前爲止是鏈中的新的寫任務的創建,然後用展開擴展方法把Task<Task>Task

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) 
{ 
    return precedingTask.ContinueWith(x => CreateWriteTask(stream, data)).Unwrap(); 
} 
1

嘗試ContinueWhenAll()ContinueWhenAny()代替ContinueWith()。 見here

+0

以下是MSDN鏈接: - http://msdn.microsoft.com/en-us/library/dd997423.aspx – prashanth 2010-09-07 21:54:51

+1

有趣的參考,但實際上並沒有解決我的問題。 ContinueWhenAll/Any沒有超負荷接受異步操作,只需操作和Func 。鏈接中的迭代器實現是一個有趣的想法,我可能會適應另一個我遇到的問題,但它假設我一遍又一遍地做同樣的事情,基本上是一種迭代的方式來做我在我現有的答案中提到(在另一個任務中創建任務)。不管怎麼說,還是要謝謝你! – FacticiusVir 2010-09-07 23:39:00

3

據我瞭解,這是一個不幸的後果,不能控制任務何時開始。 當任務開始因爲你永遠不知道,也不能像

precedingTask.ContinueWith(Task nextTask) 

因爲一旦創建,它可能已經當你到「ContinueWith」開始過載。此外,它也會造成類型混亂。這裏應該是什麼類型的:

precedingTask<T>.ContinueWith(Task<..what?..> nextTask) 

前面的返回一個T,所以接下來要做什麼並返回什麼? :)雖然這可以通過關閉來解決。