当前位置: 首页 > 面试题库 >

在使用C#的.NET中是否可以在没有多线程的情况下实现基于事件的异步模式?

仇炜
2023-03-14
问题内容

我对Node.js的体系结构设计感到惊讶,并想知道C#是否能够进行这样的设计:

异步,基于事件/事件循环,无阻塞的I / O,无需多线程。


问题答案:

我认为所有BeginXyz实现标准异步编程模型的操作都在线程池线程上运行回调,这使应用程序自动成为多线程。

但是,您可以通过使用Windows
Control.Invoke或更常见的Windows应用程序维护的单个GUI线程同步所有操作,从而实现单线程异步编程模型SynchronizationContext

每个对的调用BeginXyz都必须按照以下方式重写:

// Start asynchronous operation here (1)
var originalContext = SynchronizationContext.Current;
obj.BeginFoo(ar =>
  // Switch to the original thread
  originalContext.Post(ignored => {
    var res = obj.EndFoo(); 
    // Continue here (2)
  }));

标记为(2)的代码将继续与(1)中的代码在同一线程上运行,因此您将仅使用线程池线程将回发转发回原始(单)线程。

作为附带说明,F#中的异步工作流更直接地支持此功能,并且可以将其用于GUI编程的优雅风格,如此处所述。我不知道node.js,但是我想您可能还会对F#
异步工作 流感到惊讶,因为它们对于异步/基于事件/ …的编程风格真的很酷:-)



 类似资料:
  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 我想使用并使其直接进入给定的url,而不是从ribbon配置中获取主机。 我知道在Spring,cloud-feign默认与ribbon和eureka一起出现。 根据这个:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#spring-cloud-ribbon-without-eure

  • Project Reactor是否可以在一个mono中等待一个事件/条件,而不需要使用每个mono的阻塞线程?使用,我可以完成这样的事情,但我不知道如何使用Project Reactor。 我的问题是我需要将请求与响应相关联。响应时间变化很大,有些甚至永远不会得到回复和超时。在客户端,每个请求阻塞线程不是问题,但由于这是一个服务器应用程序,我不想最终导致每个请求产生一个线程阻塞等待响应。 API如

  • 在Spring Boot的文档中,我只找到了使用Redis会话的例子,不使用Redis也能使用它吗?

  • 我已经从源代码处构建并安装了另一个glibc,并且我想让现有的用C++编写的可执行文件与自定义glibc一起运行,以供实验之用。为了做到这一点,我尝试更改可执行文件的加载程序。首先,在/lib64下创建了一个名为的链接,其路径指向新的加载程序 其次,通过文本编辑器修改了可执行文件中的加载器路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x8

  • 现在亚马逊加入了单点登录供应商的行列。它们只支持OAuth2.0。 总而言之,OAuth2.0似乎是获胜的候选者,而不是openid,因为我关心的所有提供者现在都支持oauth。 所以我考虑直接在我的电子商务站点中实现oauth。 Facebook提供了一种完全的服务器端方式,不涉及JavaScripts。 亚马逊没有。 但它都是OAuth2.0,不是吗? 我想实现几个oauth提供程序。其中肯定