C#。如果“等待后”线程繁忙,会发生什么? - c#

等待任务完成但启动异步方法的线程不可用时,C#会发生什么(例如,处理另一个请求)?然后将使用另一个线程而不是第一个线程,或者执行将等到繁忙线程可用?

预先感谢您的回答。

参考方案

这取决于安排继续的线程的SynchronizationContext

例如,当您在具有UI线程的应用程序(例如ASP.NET或WPF应用程序)中使用async/await时,在UI线程上安排的任何延续也将在UI线程上执行。在控制台应用程序中,不会捕获任何SynchronizationContext,并且默认行为是在必须恢复执行时在任何可用线程上执行。如果您想一想,实际上在“任何”线程上执行比在安排继续的完全相同的线程上执行要容易得多。

所有这些仅部分正确,因为您可以配置await调用以通过在SynchronizationContext之前在返回的ConfigureAwait(false)上调用Task来不捕获当前的await

为了说明这一点,请注意,如果您在ASP.NET应用程序中在UI线程上启动异步工作,然后强制其阻塞直到工作完成,例如通过在返回的Task.Result上调用Task,则代码可能会死锁。 。现在,您有一个必须在UI线程上执行的延续,但是UI线程正在等待该延续执行,因此将永远不会继续执行。如果您在控制台应用程序中执行相同的操作,并且线程池中有可用线程,则代码不会被阻塞,因为它可以在“任何”线程上自由执行。调用ConfigureAwait(false)后,任何应用程序中都会发生相同的情况-因为不会捕获任何SynchronizationContext

TL; DR:您实际上已经问了一个相当简单的问题,答案非常复杂。简短地说:允许执行在任何线程上继续,除非SynchronizationContext强制执行该操作。进行更详细的讨论将使该答案变成相当大的博客文章,比我聪明得多的人已经撰写了有关此问题的博客文章,因此,我将把您链接到该主题的更多资源:

Stephen Toub's FAQ about ConfigureAwait

Stephen Cleary's detailed MSDN article

Stephen Toub's "Await, SynchronizationContext, and Console Apps"

Stephen Cleary about ASP.NET Core SynchronizationContext

Stephen Cleary's "Don't Block on Async Code"

What does SynchronizationContext do?

Why the default SynchronizationContext is not captured in a Console App?

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…

如何使用JavaScript访问嵌入式ASP.NET GlobalResources? - javascript

我正在开发一个遗留的ASP.NET项目,该项目正试图缓慢地进行调整,但是如果没有像巧克力手指屋一样塌陷的情况,我将无法进行重大更改。我试图为此找到解决方案,但由于术语的特定混合(“ javascript”,“ embedded”和/或“ resource”只是为我提供了有关如何嵌入.js文件的信息,而失败了)。 。),这可能是一种怪异的处理方式。该项目将Ap…

如何使用ASP.NET ViewState使用JavaScript - c#

我的页面中有UL,它为空。我开始使用JavaScript使用LI填充它。在回发阶段如何在asp.net中使用此新添加的动态数据?那是因为我的提交按钮是asp.net控件。我不想使用JS POST。谢谢 参考方案 我过去通过在隐藏字段中填充要发布的动态数据来完成此类操作,您可以-在回传之前触发JavaScript事件,该事件将数据从UL解析到隐藏字段中要么更新…