Обеспечивает ли Task.Run каждый метод до завершения

Существует два метода, которые вместе должны выполняться параллельно, это связано с ограничением по времени. Следующий фрагмент данных, который будет работать, подходит каждые 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 (результат) будет выполняться до завершения для каждой задачи или возможно, что если задача завершается и вызывает ReportResults (результат) а затем еще одна задача завершает, что она может вызвать ReportResults (результат), что приводит к непредсказуемому поведению?

TIA, Doug

Всего 1 ответ


Каждый метод будет завершен, если только что-то не срывает процесс или домен приложения.

Поскольку «call ReportResults (результат) приводит к непредсказуемому поведению», это зависит от того, как 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.


Есть идеи?

10000