我有以下代码:

Parallel.Invoke(
                () => this.GetUsers(),
                () => this.GetFrequentVisitors(),
                () => this.GetTenantSettings(),
                () => this.GetTranslations()
            );

所有这些都是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);

似乎永远卡在那里并阻止了我的应用程序。

注意:这是在我正在等待的async Task方法中,但是里面没有等待(我显示的是完整的方法)。如果我更改它,我不会得到不同的结果。

谁能帮我一下吗?有一点解释吗?我现在正在为异步/线程而苦苦挣扎。

读这个article有点帮助,但是他们似乎不需要await.Invoke()令我感到惊讶。

最佳答案

如果您的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);

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

关于c# - 等待C#中Parallel.Invoke()的结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35459631/

10-13 00:26