我有以下代码:
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/