完成第一个任务后,如何使异步任务继续执行下一个任务?

用户1066231

依赖完成后如何继续下一个任务?会有Task.ContinueWith()帮助吗?如果不是,我怎样才能有效地处理以下情况而不将功能整合到一个功能中?假设有 4 个异步函数:

async Task<string> Func1(string a){}
async Task<string> Func2(string returnedStringFromFunc1 ){}
async Task<string> Func3(string b){}
async Task<string> Func4(string returnedStringFromFunc3){}

Task tsk1 = func1("abc");
Task tsk3 = func3("efg");
await tsk1; // In case tsk3 is completed early, flow is waiting here.
    // Instead I could have started tsk4. 
Task tsk2 = func2(tsk1.Result);
await tsk3;
Task tsk4 = func4(tsk3.Result);
神秘性

尝试使用这些非常有用的扩展方法:

public static class TaskEx
{
    public static async Task<R> Select<T, R>(this Task<T> task, Func<T, R> s)
    {
        var t = await task;
        return s(t);
    }
    public static async Task<R> SelectMany<T, R>(this Task<T> task, Func<T, Task<R>> k) => await k(await task);
    public static async Task<R> SelectMany<T, U, R>(this Task<T> task, Func<T, Task<U>> k, Func<T, U, R> s)
    {
        var t = await task;
        var u = await k(t);
        return s(t, u);
    }
}

然后你可以这样做:

async Task Main()
{
    Task<string> q1 =
        from x in Func1("abc")
        from y in Func2(x)
        select y;

    Task<string> q2 =
        from x in Func3("efg")
        from y in Func4(x)
        select y;

    string r1 = await q1;
    string r2 = await q2;

    Console.WriteLine(r1);
    Console.WriteLine(r2);
}

Task<string> Func1(string a) => Task.FromResult(a);
Task<string> Func2(string c) => Task.FromResult($"{c}!");
Task<string> Func3(string b) => Task.FromResult(b);
Task<string> Func4(string d) => Task.FromResult($"{d}!");

我得到以下信息:

abc!
efg!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++在继续下一个任务之前先完成当前任务

角度5:如何等待服务完成,然后继续执行下一个任务?

如何仅等待第一个任务完成

如何继续执行第一个成功的任务,如果所有任务失败,则引发异常

SSIS-For循环后如何执行下一个任务

在继续执行下一个任务之前,使gulp同步写入文件

如何执行一个PHP任务并使另一个正在执行的任务搁置/休眠,直到第一个任务完成/完成一半?

在多个锁中,当第一个线程已锁定至第一个任务时,如何使第二个线程不处于空闲状态而转而锁定至下一个任务?

在异步模块中完成一个任务列表后,如何提交另一个任务列表?

jbpm 5.4任务已完成,但未创建下一个任务

告诉waf等待任务完成,然后盯着下一个任务

任务执行器不会立即运行下一个任务

Alfresco:如何在下一个任务中查看完成任务的数据?

如何打印下一个要执行的crontab任务?

Java中的任务执行器,可返回第一个结束任务

气流:在下一个任务中获取上一个任务ID

RxJava:如何仅在最后一个任务完成后才每5秒执行一次任务

如何仅使用foreach循环的第一个输出来执行某些任务?

Camunda跳至下一个用户任务

设置变量以用于下一个任务

当第二个依赖于第一个时执行异步任务

如何设置芹菜链中第一个任务的任务ID?

在第一个任务之后运行另一个任务

如何定期执行任务,但以某种方式,直到最后一个任务完成后才能开始

在为下一个成员运行循环之前完成任务

快速移动到下一个任务,而无需等待其他主机完成该任务

包含多个生成任务的Grunt任务将仅运行第一个任务

如何在完成另一个任务之前完成一个任务

在另一个任务完成后运行一个耙任务