С появлением 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 и как лучше поступить, если осуществима?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как можно узнать что за элемент находится в 5-ом месте в строке с конца считая ?
Делаю простой файловый менеджерПапки/файлы отображает компонент webBrowser
Скажите пожалуйста, в чем разница между созданием веб-сокета с помощью конструкции типа:
Вроде бы уже поменял все названия столбцов так, что бы они не совпадали с ключевыми словами SQL, но ошибка осталась