Гарантирует ли Task.Run, что каждый метод будет выполнен до конца? - PullRequest
0 голосов
/ 15 ноября 2018

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

ТИА, Дуг

1 Ответ

0 голосов
/ 15 ноября 2018

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

Как «вызов 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...