我測試C#異步的asynchronousity /等待和跨越一個驚喜,其中用於ContinueWith隨後的代碼不等待前面的任務完成就來了:C#鏈式ContinueWith不是在等待前一個任務來完成
public async Task<int> SampleAsyncMethodAsync(int number,string id)
{
Console.WriteLine($"Started work for {id}.{number}");
ConcurrentBag<int> abc = new ConcurrentBag<int>();
await Task.Run(() => { for (int count = 0; count < 30; count++) { Console.WriteLine($"[{id}] Run: {number}"); abc.Add(count); } });
Console.WriteLine($"Completed work for {id}.{number}");
return abc.Sum();
}
[Test]
public void TestAsyncWaitForPreviousTask()
{
for (int count = 0; count < 3; count++)
{
int scopeCount = count;
var c = SampleAsyncMethodAsync(0, scopeCount.ToString())
.ContinueWith((prevTask) =>
{
return SampleAsyncMethodAsync(1, scopeCount.ToString());
})
.ContinueWith((prevTask2) =>
{
return SampleAsyncMethodAsync(2, scopeCount.ToString());
});
}
}
輸出顯示運行執行0.0,1.0和2.0正確異步執行,但隨後的X.1和十,得到幾乎立即開始和十,實際完成:這是與下面的測試方法執行
在x.1之前。例如。如下記錄:
[2] Run: 0
[2] Run: 0
[2] Run: 0
Completed work for 2.0
Started work for 0.1
Started work for 0.2 <-- surprise!
[0] Run: 2
[0] Run: 2
[0] Run: 2
[0] Run: 2
[0] Run: 2
看來continueWith僅將在第一個任務(0)等,無論後續的鏈條。 我可以通過在第一個Continuewith塊中嵌套第二個ContinueWith來解決問題。
我的代碼有問題嗎?我假設Console.WriteLine尊重FIFO。
['ContinueWithWith'是一種極其低級的管道方法](http://blog.stephencleary.com/2013/10/continuewith-is-dangerous-too.html)。你應該使用'await'而不是'ContinueWith'。 –