在C#中等待Parallel.Invoke()的结束

Gil*_*and 1 c# parallel-processing multithreading asynchronous

我有以下代码:

Parallel.Invoke(
                () => this.GetUsers(), 
                () => this.GetFrequentVisitors(),
                () => this.GetTenantSettings(),
                () => this.GetTranslations()
            );
Run Code Online (Sandbox Code Playgroud)

所有这些都是Async Task方法,所有这些方法一起大约需要30秒,而并行应该大约需要7秒.

现在,如果我在之前和之后记录时间Parallel.Invoke,我还不到一秒钟.

我的问题是:为什么?而且我怎么await.Invoke(),所以我知道当最后的呼叫结束?

现在我只能实现看起来一切都是即时的,这似乎是错误的,或者是顺序的一切,这对用户来说是难以忍受的.

我也试过这个:

    Task users = this.GetUsers();
    Task visitors = this.GetFrequentVisitors();
    Task settings = this.GetTenantSettings();
    Task translations = this.GetTranslations();


    Task.WaitAll(users, visitors, settings, translations);
Run Code Online (Sandbox Code Playgroud)

这似乎永远挂在那里阻止我的应用程序.

注意:这是async Task我正在等待的方法,但内部没有等待(我展示的是完整的方法).如果我改变它,我得到没有不同的结果.

任何人都可以帮我一点吗?有一点解释?我现在正在努力处理异步/线程问题.

阅读此 文章帮助了一点,但他们似乎并不需要await.Invoke()这让我吃惊.

Dam*_*ver 5

使用您的WaitAll变体"永远悬挂",它表明您正在使用UI线程,并且这些方法中的一个或多个也希望进入UI线程.

将此当前方法更改为async您可以改为await:

Task users = this.GetUsers();
Task visitors = this.GetFrequentVisitors();
Task settings = this.GetTenantSettings();
Task translations = this.GetTranslations();

await Task.WhenAll(users, visitors, settings, translations);
Run Code Online (Sandbox Code Playgroud)

而且,重要的是,这将释放UI线程(或其他重要的同步上下文),以便这些其他异步方法可以取得进展.

  • 嗯,这很好用.感谢大家的帮助,这就是我喜欢这个社区的原因.看看你的评论和文档,它现在都很清楚,实际上非常明显. (2认同)