Доброго времени суток.
.NET 4.0
В примерах на MSDN приведены элементарные случаи, когда цепочки вызовов строятся из синхронных методов и функций.
Мне же требуется объединить воедино несколько асинхронных задач, связав в единую цепочку.
Есть базовый метод ReadAsync у Stream. Возвращает Task
Его оборачивает другой метод — ReadInt32Async. Возвращает Task<int>
Я связываю в цепочку: считать перове число, считать второе число, перемножить результаты.
Проблема заключается в том, что метод Start нужно дёрнуть у каждой начальной таски в цепи.
Тоесть у каждой из ReadAsync и у первого ReadInt32Async.
А хочется дёрнуть его один раз, у последней таски и подождать её завершения. Но так делать нельзя — возникает исключение, ибо эта таска является продолжением предыдущих.
Как быть?
Создавать таски сразу запущенными?
var task = ReadInt32Async().ContinueWith(p => p.Result * ReadInt32Async().Result);
task.Start();
int result = task.Result;
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Здравствуйте, ionoy, Вы писали:
I>Запускать надо первый таск, остальные запустятся сами.
Это я понимаю.
Вопрос касается архитектурного решения. И, похоже, он уже разрешён, ибо MS так и делает — асинхронные методы запускаются автоматически, при обращении, не требуя ручного запуска через .Start()
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Здравствуйте, Albeoris, Вы писали:
A>Это я понимаю. Вопрос касается архитектурного решения. И, похоже, он уже разрешён, ибо MS так и делает — асинхронные методы запускаются автоматически, при обращении, не требуя ручного запуска через .Start()
Да, для async-методов стандартное соглашение — запускать таски в момент вызова метода (в официальной терминологии — hot tasks).
Несколько советов:
1. Изучить официальные
guidelines/
FAQ.
2. По возможности смотреть на await/Rx для работы с несколькими асинхронными источниками.
3. Не добавлять асинхронность там, где она явно не нужна (см. ReadInt32Async().Result).