Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Передача данных из завершившегося потока в работающий

#c_sharp #многопоточность


Мы запускаем параллельно 2 потока, они выполняют какую-то длительную работу. Мы знаем,
что потом А выполнится быстрее потока B. Как после завершения А передать его результат
потоку B?

Приходит в голову решение в лоб: писать результаты работы первого потока в статическую
переменную и читать ее во втором потоке. Но мне кажется есть способы получше. Может
вы знаете, как это сделать?
    


Ответы

Ответ 1



Правильный вариант — вовсе не работать с низкоуровневой абстракцией потока. Для возвращения значений у вас есть Task, его и используйте. Например: Task Compute() { return Task.Run(() => { int result; // длинные сложные вычисления return result; }; } Теперь этим результатом можно пользоваться: Task computeTask = Compute(); // проверить, завершились ли вычисления if (computeTask.IsCompleted) // ... // дождаться окончания работы и получить результат int result = await computeTask;

Ответ 2



string s = ""; Task A = new Task(() => { Thread.Sleep(500); //..... s = s + "Return 77 from A\n"; return 77; }); Task B= new Task(async () => { Thread.Sleep(2000); //..... var x = await A; s = s + string.Format("B got {0} from A",x); }); A.Start(); B.Start(); B.Wait(); Console.WriteLine(s);

Комментариев нет:

Отправить комментарий