Task.Run 是否保证每个方法都会 运行 完成

Does Task.Run guarantee each method will be run to completion

有两种方法一起必须并行运行,这是由于时间限制。例如,下一条要处理的数据每 100 毫秒出现一次。

 List<Widget> widgetList = new List<Widget>() 
 {
     file list with 100 widget objects
 }
 List<Task> tasks = new List<Task>();

 foreach (Widget widget in widgetList)
 {
    Task t = Task.Run(async () =>
    {
       var result = await widget.Analyze(newData);
       ReportResults(result);
    });
    tasks.Add(t);
  }
  Task.WaitAll(tasks.ToArray());

不,这不是一个完整的代码示例,但应该足以解决如下问题: 我可以确定 ReportResults(result) 将 运行 完成每个任务,或者是否有可能如果一个任务完成并调用 ReportResults(result) 然后另一个任务完成它可以调用 ReportResults(result) 导致不可预测的行为?

TIA, 道格

每个方法都将 运行 完成,除非有东西拆除进程或应用程序域。

作为 "call ReportResults(result) resulting in unpredictable behavior",这取决于 ReportResults 的工作方式。

我会这样做:

var results = await Task.WhenAll(
    for widget in widgetList
    select widget.Analyze(newData));

foreach (var result in results)
{
    ReportResults(result);
}

注意: async-await 是 C# 5.0 的功能,在 C# 4.0 中不可用。