簡體   English   中英

如何確保所有任務均已執行並查詢最終結果

[英]How to ensure all tasks have been executed and query the final results

我正在使用Tasks執行計算密集型操作。 PerformCalculation方法。 主父任務使用任務工廠創建三個子任務並開始執行。 每個子任務應返回一個List<Dictionary<int,double>>

List<double> paramList = new List<double>{ 2, 2.5, 3};

CancellationTokenSource cts = new CancellationTokenSource();

Task parent = new Task(() =>
{
    var tf = new TaskFactory<List<Dictionary<int, double>>>(cts.Token, TaskCreationOptions.AttachedToParent,
    TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);

    var childTasks = new[] {
        tf.StartNew(() => PerformCalculation(cts.Token, paramList[0],Task.CurrentId)),
        tf.StartNew(() => PerformCalculation(cts.Token, paramList[1],Task.CurrentId)),
        tf.StartNew(() => PerformCalculation(cts.Token, paramList[2],Task.CurrentId)) //3rd entry
        };

成功執行子任務的結果應為List<Dictionary<int, double>>

現在,我的要求是編寫一個lambda表達式,該表達式將在所有子任務執行完畢並填充到另一個列表中時查詢所有子任務的結果

即列表列表( List<List<Dictionary<int, double>>>

// When all children are done, get the value returned from the
// non-faulting/canceled tasks. 
tf.ContinueWhenAll(childTasks, completedTasks => 
                   completedTasks
                   .Where(t => t.Status == TaskStatus.RanToCompletion)**??Need HELP HERE ???**),CancellationToken.None)
,TaskContinuationOptions.ExecuteSynchronously);

});

我會回避這個問題,因為所有這些API基本上已經過時了(或者至少不適合“主流”方案)。 這實際上很容易:

var childTasks = new[] {
    Task.Run(() => PerformCalculation(cts.Token, paramList[0],Task.CurrentId)),
    Task.Run(() => PerformCalculation(cts.Token, paramList[1],Task.CurrentId)),
    Task.Run(() => PerformCalculation(cts.Token, paramList[2],Task.CurrentId)),
    };

var results = Task.WhenAll(childTasks).Result;

TaskFactory是一種相當深奧的類型,我從未在野外使用過。 應避免附加的子任務,因為它們會添加非顯而易見的依賴關系。 這些都不是錯誤,但它們都是氣味。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM