Связывание независимых асинхронных методов, возвращающих Task ContinueWith
От: Albeoris  
Дата: 07.02.14 09:43
Оценка:
Доброго времени суток.
.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;
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re: Связывание независимых асинхронных методов, возвращающих Task ContinueWith
От: ionoy Эстония www.ammyui.com
Дата: 07.02.14 09:57
Оценка:
Здравствуйте, Albeoris, Вы писали:

A>Создавать таски сразу запущенными?


Запускать надо первый таск, остальные запустятся сами.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Связывание независимых асинхронных методов, возвращающих Task ContinueWi
От: Albeoris  
Дата: 07.02.14 10:35
Оценка:
Здравствуйте, ionoy, Вы писали:
I>Запускать надо первый таск, остальные запустятся сами.

Это я понимаю. Вопрос касается архитектурного решения. И, похоже, он уже разрешён, ибо MS так и делает — асинхронные методы запускаются автоматически, при обращении, не требуя ручного запуска через .Start()
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Re[3]: Связывание независимых асинхронных методов, возвращающих Task ContinueWi
От: Sinix  
Дата: 07.02.14 12:31
Оценка:
Здравствуйте, Albeoris, Вы писали:


A>Это я понимаю. Вопрос касается архитектурного решения. И, похоже, он уже разрешён, ибо MS так и делает — асинхронные методы запускаются автоматически, при обращении, не требуя ручного запуска через .Start()


Да, для async-методов стандартное соглашение — запускать таски в момент вызова метода (в официальной терминологии — hot tasks).

Несколько советов:
1. Изучить официальные guidelines/FAQ.
2. По возможности смотреть на await/Rx для работы с несколькими асинхронными источниками.
3. Не добавлять асинхронность там, где она явно не нужна (см. ReadInt32Async().Result).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.