С появлением async await все стало красиво. Возьмем, например, такой кусочек кода
async Task Anything()
{
var resTask = Task.Run(SomeFunction2);
SomeAction();
SomeFunction(await resTask);
await SomeAction2();
SomeAction3();
}
То есть тут SomeFunction дожидается выполнения SomeFunction2 для того, чтобы использовать ее результат в качестве параметра.
При этом SomeAction() и SomeAction3() будут выполняться в контексте, в котором запущен Anything()
Но вот в версии фреймворка 4.0 отсутствуют async/await. Приходится выкручиваться. Приходится писать что то вроде этого
void Anything()
{
Task.Factory.StartNew((Action)(() =>
{
var resTask = Task.Factory.StartNew(SomeFunction2);
SomeAction(); // я теряю основной контекст
SomeFunction(resTask.Result);
var t = new Task(SomeAction2); // я теряю основной контекст
t.Start();
t.Wait();
SomeAction2(); // я теряю основной контекст
}));
}
Это если без тонких нюансов (например, если SomeAction() должен выполняться в UI потоке, управление выполняемой задачей и тд. Я уже не говорю про неуправляемый таск в самом начале)
В противном случае код расползется и будет либо не лаконичным либо говнокодом. (на всякий случай скажу, что я понимаю, что в моем примере тоже говнокод, да я знаю об этом :) )
Я же хочу сделать некий билдер для построения сценариев задач. То есть, что то вроде этого
void Anything()
{
var builder = new TaskBuilder();
var res = builder.InNewContext(SomeFunction2);
builder.InThisContext(SomeAction);
builder.InNewContext(SomeFunction(res.Result));
var forWaiting = builder.InNewContext(SomeAction2);
builder.InThisContext(SomeAction3, forWaiting);
builder.Start();
}
Но вот тут есть проблема
В этом месте
builder.InNewContext(SomeFunction(res.Result));
Возникнет коллапс, потому что задача еще не запущена, но включается ее ожидание для получения результата. Чутье подсказывает мне, что мне могут помочь Expression, но я не очень умею их готовить. В общем подскажите, осуществима ли моя задумка для фреймворка 4.0 и как лучше поступить, если осуществима?
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости