在C#中如何在同一线程中运行异步方法

2024-02-18

是否可以在与调用者相同的线程中异步定义和调用方法? 假设我只有一个核心,并且我不希望 100 个线程产生线程管理开销。

Edit我问的原因是 NodeJS 的做事模型 - 一个线程上的所有事情都不会阻塞任何事情,这被证明是非常有效的,这让我想知道在 C# 中是否可以实现同样的东西(我自己无法实现)。

Edit2好吧,正如评论中所指出的,节点毕竟不是单线程的(但是简单的负载测试表明,它只使用一个核心......),但我认为使它如此高效的原因是仅写入非阻塞的隐含要求代码。这在 C# 中是可能的,除非不需要:) 不管怎样,谢谢大家......

更多信息在 这个帖子 https://stackoverflow.com/questions/2842264/is-it-possible-in-net-using-c-to-achieve-event-based-asynchronous-pattern-wi甚至更多this one https://stackoverflow.com/questions/8905860/is-a-non-blocking-single-threaded-asynchronous-web-server-like-node-js-possi


目前还不清楚你在谈论什么上下文,但是async/awaitC# 5 的功能已经有助于支持此类事情。不同之处在于,在 Node.js 中,一切都是forced默认情况下是单线程的(据我所知;很可能错误地给出了注释中的链接),.NET 中使用异步的服务器端应用程序将使用很少的线程,而不会限制自己。如果一切真的can由单个线程提供服务,很可能是这样——如果在物理处理方面您从来没有超过一件事要做,那么那很好。

但是,如果一个请求进来而另一个请求正在做一些工作怎么办?也许它只是做了少量的加密,或者类似的事情。您真的想让第二个请求等待第一个请求完成吗?如果你这样做,你could在 .NET 中相当容易地使用以下模型TaskScheduler与单线程线程池关联...但更常见的是,您可以使用 .NET 中内置的线程池,它可以高效工作,同时仍然允许并发。

首先,您应该确保您使用的是 .NET 4.5 - 与早期版本的 .NET 相比,它具有更多的异步 API(例如用于数据库和文件访问)。您想要使用符合以下要求的 API基于任务的异步模式 (TAP) http://msdn.microsoft.com/en-us/library/hh873175.aspx。然后,使用异步/等待 http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx您可以编写服务器端代码,以便它reads有点像同步代码,但实际上是异步执行的。例如,您可能有:

Guid userId = await FetchUserIdAsync();
IEnumerable<Message> messages = await FetchMessagesAsync(userId);

尽管您需要在每个操作进行时“等待”,但这样做不会阻塞线程。 C# 编译器负责为您构建状态机。无需显式编写经常变成意大利面条代码的回调 - 编译器会完成这一切。

您需要确保您使用的任何 Web/Web 服务框架都支持异步,并且它应该只管理其余部分,使用尽可能少的线程。

按照上面的两个链接了解有关 C# 5 中异步支持的更多信息 - 这是huge我相信您之后会有更多问题,但是当您阅读更多内容后,您应该能够提出非常多的问题specific问题而不是当前的广泛问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C#中如何在同一线程中运行异步方法 的相关文章

随机推荐