ren*_*ren 2 c# multithreading asynchronous
是否可以在与调用者相同的线程中异步定义和调用方法?假设我只有一个核心,我不希望线程管理开销与100个线程一样.
编辑 我问的原因是nodejs服务模型 - 一个线程上的所有东西都没有阻塞任何东西,这被证明是非常有效的,这让我想知道C#中是否有相同的东西(我自己无法实现).
Edit2嗯,正如评论节点中所指出的那样,节点毕竟不是单线程的(不过简单的负载测试显示,它只使用一个核心...),但我认为是什么让它如此高效是隐含的要求只写非阻止代码.这在C#中是可能的,除了不需要:)无论如何,谢谢大家...
目前还不清楚你正在谈论的是什么语境,但C#5 的async/ await功能已经有助于支持这类事情.不同之处在于,在node.js中,默认情况下所有内容都被强制为单线程(据我所知;很可能错误地给出了注释中的链接),使用异步的.NET中的服务器端应用程序将使用很少的线程限制自己.如果所有内容都可以由单个线程提供,那么很可能 - 如果您在物理处理方面从未有过多个事情,那就没关系.
但是,如果一个请求进入而另一个请求做了一些工作呢?也许它只是进行少量加密,或类似的东西.你真的想让第二个请求等待第一个请求完成吗?如果你这样做,你可以使用TaskScheduler与单线程线程池相关联的方式很容易地在.NET中对其进行建模...但更常见的是,你将使用.NET内置的线程池,它仍能有效地工作允许并发.
首先,您应该确保使用的是.NET 4.5 - 它具有比早期版本的.NET更多的异步API(例如,用于数据库和文件访问).您希望使用符合基于任务的异步模式(TAP)的 API .然后,使用async/await,您可以编写服务器端代码,使其读取有点像同步代码,但实际上是异步执行.例如,你可能有:
Guid userId = await FetchUserIdAsync();
IEnumerable<Message> messages = await FetchMessagesAsync(userId);
Run Code Online (Sandbox Code Playgroud)
即使你需要在每个操作谈话时"等待",你也可以不阻塞线程.C#编译器负责为您构建状态机.没有必要显式地编写经常变成意大利面条代码的回调 - 编译器会完成所有操作.
您需要确保您使用的任何Web/Web服务框架都支持异步,并且它应该只使用尽可能少的线程来管理其余部分.
按照上面的两个链接找到有关C#5中异步支持的更多信息 - 这是一个很大的话题,我相信你之后会有更多的问题,但是当你读了更多的话,你应该可以问一下非常具体的问题,而不是当前的广泛问题.
| 归档时间: |
|
| 查看次数: |
1803 次 |
| 最近记录: |