У меня есть Task<T> t1
. Я хочу запустить еще один Task t2
после завершения t1
. Я предпочитаю использовать метод .ContinueWith
t1
.Почему ContinueWith передает задачу как параметр
void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobber => frobber.Frob())
}
Кроме этого, я не могу этого сделать, потому что параметр Действия Task<T>
передается Task<T>
, а не сам T
. Вместо этого я должен принять результат параметра, переданного в мое действие, чтобы взаимодействовать с ним.
void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobberTask => {
var frobber = frobberTask.Result;
frobber.frob();
});
}
Если точка ContinueWith является добавление другого действия в цепи, то почему бы не разработчики языка просто прошли результат предыдущей задачи? Или, в случае неосновной Задачи, ожидается действие без параметров?
Что является результатом предыдущей задачи, если исключение задачи выбрано? – PetSerAl
Мышление в соответствии с непараллельной разработкой или обещаниями, я ожидал бы другую подпись метода для обработки исключений. ContinueWith означает, что предыдущая задача завершена, а не ошибка. – psaxton
BTW, я думаю, что лучше использовать 'ContinueWith (async t => {var result = await t ...})', а не '.Result', даже для самого маленького риска, что кто-то скопирует-вставьте действие во внешний код, где '.Result' может блокировать поток. –