Я не совсем уверен, что не так с простым написанием этого:
var t1 = new Task<int>(() => 1)
var r = from x in t1
from y in new Task<int>(() => x + 1)
select y;
r.ContinueWith(x => Console.WriteLine(x.Result));
t1.Start();
или этого:
var t = new Task<int>(() => 1)
t.ContinueWith(x => x.Result + 1)
.ContinueWith(x => Console.WriteLine(x.Result))
t.Start();
Это прямо выражает то, что вы действительно хотите сделать.(Это начальное задание, которое вы хотите запустить. Так что же не так с вызовом Start
для этого начального задания?) Почему вы ищете синтаксис, который затемняет это?
EDIT : исправлен первый пример ...
РЕДАКТИРОВАТЬ 2 , чтобы добавить:
Итак, теперь я понимаю, что LinqToTasks ожидает, что селекторы задач вернут запущенные задачи.Итак, второе предложение from
в вашем первом примере возвращает задачу, которая никогда не будет выполняться.Итак, что вам действительно нужно, это:
var t1 = new Task<int>(() => 1);
var r = from x in t1
from y in Task<int>.Factory.StartNew(() => x + 1)
select y;
r.ContinueWith(x => Console.WriteLine(x.Result));
t1.Start();
Ничто другое не будет вызывать Start
для задач, созданных в этих пунктах from
.Поскольку соответствующие селекторы на самом деле не выполняются до тех пор, пока не завершится предыдущая задача, вы по-прежнему контролируете, когда запускать корневую задачу.
Кажется, что это работает, но это довольно уродливо.Но похоже, что именно так разработан LinqToTasks ... Я думаю, что я бы придерживался обычного синтаксиса вызова функций.