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()这让我吃惊.
使用您的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线程(或其他重要的同步上下文),以便这些其他异步方法可以取得进展.
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |