gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:18 25 4
gpt4 key购买 nike

我有以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com