Отложенное получение результата задачи

238
28 марта 2017, 10:13

С появлением 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 и как лучше поступить, если осуществима?

READ ALSO
Элементы в строке

Элементы в строке

Как можно узнать что за элемент находится в 5-ом месте в строке с конца считая ?

217
Проблема с компонентом textBox

Проблема с компонентом textBox

Делаю простой файловый менеджерПапки/файлы отображает компонент webBrowser

265
Создание WebSocket'а

Создание WebSocket'а

Скажите пожалуйста, в чем разница между созданием веб-сокета с помощью конструкции типа:

244
Ошибка при выполнении SQL-запроса в PHP (PDO)

Ошибка при выполнении SQL-запроса в PHP (PDO)

Вроде бы уже поменял все названия столбцов так, что бы они не совпадали с ключевыми словами SQL, но ошибка осталась

303