首页 > 解决方案 > 关于等待任务异步的非常简单的问题

问题描述

在阅读和观看视频数小时后,我似乎无法弄清楚一件简单的事情。

这两者之间有区别还是编译器会为我这样做?每次等待时我真的需要做 Task.Run 吗?

            Task.Run(async () =>
            {
                await _databaseConnectionHelper.SetDatabaseConnectionFromOrganization(orgId);

            }).Wait();

await _databaseConnectionHelper.SetDatabaseConnectionFromOrganization(orgId);

另外,我看到有些人说要始终使用 ConfigureAwait(false),有些人说不要。我似乎无法得到一个直接的答案。

感谢您帮助新手。我真的很想找到这个,并且在过去的几天里花了几个小时研究等待/异步。我比以前更了解它,但是一些基础知识却让我无法理解。

顺便说一句,这是在 .NET Core 3.1 项目中,如果这有所作为的话。我的应用程序基本上是访问数据库并将它们显示在网站上的 CRUD。

标签: .netasync-awaitasp.net-core-3.1

解决方案


这两者之间有区别还是编译器会为我这样做?

就在这里。第一个将阻塞当前线程直到Task.Run完成,如果您的调用是异步的,第二个将允许重用当前线程。因此,在某些情况下,与第二个相比,第一个可能会导致明显的性能下降。

每次等待时我真的需要做 Task.Run 吗?

不,你没有,我想说你应该(几乎)永远不要在现代代码库中做这样的事情。

我看到有些人说要一直使用ConfigureAwait(false),有些人说不要

当您编写一些任何人都可以使用的库(UI 应用程序,或旧版 ASP.NET 应用程序,或任何其他可能存在上下文的地方)时,这是一般的经验法则。但在你的情况下,如果你有“vanilla” ASP.Net Core 3.1 webapp,你就不需要(参见已经链接的帖子)。

此外,如果您想更深入地了解ConfigureAwaitStephen Cleary 的这篇文章Stephen Toub 的这篇文章。


推荐阅读