[英]Ordering of tasks in TPL
如果我有以下代碼
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static Task<int> GetSuperLargeNumber()
{
var main = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
return 100;
});
var second = main.ContinueWith(x => Console.WriteLine("Second: " + x.Result), TaskContinuationOptions.AttachedToParent);
var third = main.ContinueWith(x => Console.WriteLine("Third: " + x.Result), TaskContinuationOptions.AttachedToParent);
return main.ContinueWith(x =>
{
Task.WaitAll(second, third);
return x.Result;
});
}
static void Main(string[] args)
{
GetSuperLargeNumber().ContinueWith(x => Console.WriteLine("Complete"));
Console.ReadKey();
}
}
}
我希望main首先啟動,然后2個依賴項可以在其后並行啟動,它們分別是第一和第二。 然后,我想返回一個帶有值的future,以便調用者在其上添加延續。 但是,我想確保第二和第三個先運行。 下面的代碼是實現此目標的最佳方法嗎? 似乎有點笨拙
我對TPL不太熟悉,但這不是ContinueWhenAll
目的嗎?
static Task<int> GetSuperLargeNumber()
{
var main = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
return 100;
});
var second = main.ContinueWith(
x => Console.WriteLine("Second: " + x.Result),
TaskContinuationOptions.AttachedToParent);
var third = main.ContinueWith(
x => Console.WriteLine("Third: " + x.Result),
TaskContinuationOptions.AttachedToParent);
return Task.Factory.ContinueWhenAll(
new[] { second, third },
(twotasks) => /* not sure how to get the original result here */);
}
我不知道如何從完成的second
和third
(包含在twotasks
)獲取main
的結果,但是也許您可以修改它們以傳遞結果。
編輯:或者,正如亞歷克斯指出,使用
Task.Factory.ContinueWhenAll(new[] { main, second, third }, (threetasks) => ...
並從threetasks[0]
讀取結果。
這樣就足夠了:
static Task<int> GetSuperLargeNumber()
{
var main = Task.Factory.StartNew<int>(() =>
{
Thread.Sleep(1000);
return 100;
});
var second = main.ContinueWith(x => Console.WriteLine("Second: " + x.Result), TaskContinuationOptions.AttachedToParent);
var third = main.ContinueWith(x => Console.WriteLine("Third: " + x.Result), TaskContinuationOptions.AttachedToParent);
Task.WaitAll(second, third);
return main;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.