当前位置: 首页 > 网络应用技术

.NET核心异步编程:缺乏同步性信息上下文是什么意思?

时间:2023-03-08 15:59:41 网络应用技术

  最近,使用.NET核心的异步条,我认为有必要深入研究.NET Core下的异步编程的各个方面。由于传统的ASP.NET和.NET Framework类库受到干扰,互联网上的互联网充满了陌生。奇怪的言论和实践奇怪的异步,因为没有对环境的解释,这会导致大量的数量在.NET核心/ASP.NET核心方面,对处理异步的处理也有深刻的误解,因此它深深地挖出了它的基本差异。对于我自己或更多.NET核心新手,这很有帮助。

  是的,SynchronizationContext上下文中的上下文被深深地放置在传统的ASP.NET同步Context中,该context在ASP.NET Core和.NET Core Core Project中被切断。***当然。winform在.netcore下是同步的概念***

  MSDN说明:它提供了在各种同步模型中传播同步上下文的基本功能。无论如何,感觉非常好,翻译大致相同。

  由于多线程编程的难度和多线程编程需要学习无数的概念和工具。为此,Microsoft提供了SynchronizationContext类。

  不幸的是,许多开发人员甚至都不知道这个有用的工具。

  在大多数基于.NET框架的项目中,它们都支持同步上下文的概念。

  包括ASP.NET,Windows Windows,Windows演示基金会(WPF),Silverlight或其他。

  以传统的ASP.NET为例,每个ASP.NET在其设计开始时都需要一个线程,直到请求完成为止。这将导致较低的线程利用率,因为创建网页通常取决于数据库查询和Web服务呼叫,并且必须等待该过程请求的线程,直到所有这些操作结束为止。

  使用异步页面,处理请求的线程可以启动每个操作,然后返回ASP.NET线程池;操作结束后,ASP.NET线程池的另一个线程可以完成请求。

  当在线程池线程上执行页面代码时,ASP.NET同步文本安装在其上。通过称该帖子为“异步”,该委员会将直接调用。

  从概念的角度来看,AspnetsynchronizationContext的上下文非常复杂。在异步页面的生存中,上下文从ASP.NET线程池的线程开始。在异步请求开始后,上下文不包括任何线程。在异步请求的末尾,用于完成其例程的线程螺纹线程进入上下文。这些线程可能是启动请求的线程,但是当操作完成后,它更有可能在空闲状态的任何线程中。

  一个常见的示例是在异步网页上使用webclient.downloaddatasync将捕获当前的同步context,然后在上下文中执行其下载事件。

  当页面启动时,ASP.NET将分配其线程的线程以在页面上执行代码。此页面可以调用downloaddaasync,然后返回;

  ASP.NET计算未完成的异步操作,以了解该页面是否已完成。

  当WebClient对象下载要求的数据时,它将收到线程池线程的通知。

  该线程将导致在捕获的上下文中下载完成。

  上下文将保留在同一线程中,但它将确保事件处理过程使用正确的徽标和区域操作。

  说了很多话,你了解吗?

  哦,哦,让我们找出一些技术要点,同步频率允许一个线程与另一个线程进行通信。支持您有两个线程,thread1 and thread2.thread1正在做一些工作,然后Thread1希望在thread2上执行代码。

  实现的一种可能的方法是询问threadRonizationContext对象的thread2对象将其提供给thread1,然后thread1可以调用SynchronizationContext.Send.Send.Send.send并在TREED2上执行代码。

  听起来像魔术...好吧,您应该知道一些东西。不是每个线程是SynchronizationContext.SynchronizationContextui始终是线程。

  退后一步,一个好问题是为什么AspnetsynchronizationContext在ASP.NET Core中删除它。尽管我不了解团队中主题的讨论,但我认为这是有两个原因:性能和简单性。

  首先,当考虑性能时,当将异步处理程序恢复为ASP.NET的旧版本时,该操作将继续与请求保持一致。SUBSESESTESSEDWORK必须等待排队的任何其他工作(一次只能运行一个)。当您准备运行时,从线程池获取线程,输入请求上下文,然后继续处理过程。“ re -input”请求上下文涉及许多内部处理任务,例如设置httpcontext.current和当前线程的身份和文化。

  使用前所未有的ASP.NET核心方法,当恢复异步处理程序时,将从线程池中获得线程并继续。避免上下文队列,而无需“输入”请求上下文。

  此外,异步/等待的机制高度优化了至尊上下文的情况。同步请求必须很少做。

  简单性是决策的另一个方面。AppNetsynchronizationContext很好,但是它包含一些棘手的部分,尤其是在身份管理中。

  好的,所以没有同步性信息。这对开发人员意味着什么?

  第一个也是最明显的结果是它不会捕获任何上下文。这意味着阻止异步代码不会导致死锁。您可以使用task.getawaiter()。getResult()(或task.wait或task.result)不必担心死锁。

  但是,您不应该这样做,这是我们经常称为同步的同步。当您阻止异步代码时,您就会放弃异步代码的所有好处。封锁线程后,异步处理程序的增强可扩展性将会被取消。

  (传统)ASP.NET中有两种情况。不幸的是,必须停止它:ASP.NET MVC过滤器和子操作。

  但是,在ASP.NET核心中,整个管道完全不同步。滤波器和视图组件都是异步的。

  因此,您需要注意的是:

  简而言之,理想情况下,您应该尝试使用异步来实现所有方法。但是,如果您的代码需要,也可以在没有危险的情况下阻止它。

  没有危险意味着没有僵局的风险,但是由于这种方法需要占据2个线程,因此它可能会在窗户上下降,但是该应用程序始终保持响应状态。在Linux上,线程可能会遇到线程。池耗尽。

  根据Daniel的解释,许多Linux I / O实际上是伪分开的。换句话说,基础API已同步,并且应用程序必须记录线程以与它们不同步,从而增加了线程池耗尽的可能性。

  这种情况的主要原因是Linux驱动程序堆栈,驱动程序还必须同时支持同步和异步操作(相反,任何I / O数据传输都必须在Windows上具有异步;

  所有同步API都位于设备上方的Win32层中)。

  异步驱动程序是世界上最难写的,因此Linux滞后于该领域的Windows。