繁体   English   中英

运行并行异步任务?

[英]Running parallel async tasks?

因此,我一直在搜索StackOverflow / Google,寻找同时运行多个异步任务的不同方法。 在不同方法之间似乎存在很多争论,我只想澄清一下。 我正在编写一个程序来执行JSON POST请求,直到服务器返回状态码200。假设我要并行运行其中的5个任务,直到其中一个返回状态码200。请尽量不要偏离主题,我无法控制服务器! 这是我当前的代码,

    static bool status = false;
    public static async Task getSessionAsync() {
        while(!status) { ... } 
    }
    public static async Task doMoreStuff() {
       ...
    }
    public static async Task RunAsync() 
    {
        await getSessionAsync ();
        await doMoreStuff();
    }
    public static void Main (string[] args)
    {
        Task.WhenAll(RunAsync()).GetAwaiter().GetResult();
    }

基本上,我想知道我这样处理是否错误,

    public static async Task RunAsync() 
    {
        for(int i = 0; i < 5; i++) {
            await getSessionAsync ();
        }
        await doMoreStuff();
    }

假设:

private Task<MySession> GetSessionAsync()
{
    // ...
}

选项1

Task.WhenAny

var session = await await Task.WhenAny(Enumerable.Range(0, 5).Select(_ => GetSessionAsync()));

选项2

您可以使用称为Amb的Rx LINQ方法,该方法将仅观察第一个返回内容的Observable。

var session = await Enumerable.Range(0, 5).Select(_ => GetSessionAsync().ToObservable()).Amb().ToTask();

这不会并行运行:

public static async Task RunAsync() 
{
    for(int i = 0; i < 5; i++) {
        await getSessionAsync ();
    }
    await doMoreStuff();
}

您必须使用Task.WhenAny()

public static async Task RunAsync() 
{
    var tasks = new List<Task>();
    for(int i = 0; i < 5; i++) {
        tasks.Add(getSessionAsync());
    }
    await Task.WhenAny(tasks);
    await doMoreStuff();
}

如果不需要当前上下文(即在编写库而不是前端代码时),请不要忘记在每次等待后使用ConfigureAwait(false)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM