c#中如何在同一个线程中运行async方法

本文关键字:运行 async 方法 线程 同一个 | 更新日期: 2023-09-27 18:11:04

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

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

Edit2好吧,正如在评论节点不是单线程毕竟(然而简单的负载测试显示,它只使用一个核心…),但我认为是什么使它如此高效的隐式要求只写非阻塞代码。这在c#中是可能的,除了不需要:)无论如何,谢谢大家…

查看

c#中如何在同一个线程中运行async方法

你说的上下文不是很清楚,但是c# 5的async/await特性已经帮助支持了这类事情。不同之处在于,而在node.js中,一切都是强制默认为单线程(据我所知;(很可能不正确地给出了评论中的链接),使用异步的。net服务器端应用程序将使用很少的线程,而不会限制自己。如果所有的都可以由一个线程提供,那么它很可能是——如果在物理处理方面你从来没有多件事要做,那么这很好。

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

首先,你应该确保你使用的是。net 4.5——它比。net早期版本有更多的异步api(例如用于数据库和文件访问)。您希望使用符合基于任务的异步模式(TAP)的api。然后,您可以使用async/await编写服务器端代码,使读取有点像同步代码,但实际上是异步执行的。例如,你可以输入:

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

尽管在这些操作进行时需要"等待",但这样做不会阻塞线程。c#编译器负责为您构建状态机。没有必要显式地编写回调,因为它经常会变成意大利面条式的代码——编译器会完成所有的工作。

你需要确保你使用的任何web/web-service框架都支持异步,并且它应该只管理剩下的部分,使用尽可能少的线程。

点击上面的两个链接了解更多关于c# 5中的异步支持——这是一个巨大的主题,我相信你之后会有更多的问题,但是当你读了更多的时候,你应该能够问非常具体的问题,而不是目前的宽泛问题。