关于等待任务异步的非常简单的问题

Very simple question about awaiting a task async

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

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

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

            }).Wait();

await _databaseConnectionHelper.SetDatabaseConnectionFromOrganization(orgId);

此外,我看到有些人说总是使用 ConfigureAwait(false) 而有些人说不要。我似乎得不到直接的答案。

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

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

Is there a difference between these two or does the compiler do this for me?

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

Do I actually need to do Task.Run every time I await?

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

I see some people say to always use ConfigureAwait(false) and some say not to

它是 a general rule of thumb,当你正在编写一些可供任何人使用的库(UI 应用程序,或遗留 ASP.NET 应用程序,或任何其他可能有上下文的地方) .但是在你的情况下,如果你有“vanilla”ASP.Net Core 3.1 webapp,你就不需要了(参见已经链接的 post)。

此外,如果您想更深入地了解 ConfigureAwait,请参阅 this post by Stephen Cleary and this one by Stephen Toub