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

标签 c# multithreading asynchronous

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

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

Edit2 好吧,正如评论中指出的那样,节点毕竟不是单线程的(但是简单的负载测试表明,它只使用一个内核......),但我认为是什么让它成为现实如此高效是只写非阻塞代码的隐含要求。这在 C# 中是可能的,除非不是必需的:)无论如何,谢谢大家...

更多信息在 this SO post甚至更多 this one

最佳答案

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

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

首先,您应该确保您使用的是 .NET 4.5 - 与早期版本的 .NET 相比,它具有更多的异步 API(例如,用于数据库和文件访问)。您想要使用符合 Task-based Asynchronous Pattern (TAP) 的 API .然后,使用 async/await您可以编写服务器端代码,使其读取 有点像同步代码,但实际上是异步执行的。因此,例如,您可能有:

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

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

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

点击上面的两个链接可以找到更多关于 C# 5 中的异步支持的信息 - 这是一个巨大的话题,我相信您之后会有更多问题,但是当您已经多读一点,您应该能够提出非常具体的问题,而不是当前的宽泛问题。

关于c# - 在 C# 中如何在同一线程中运行异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16255539/

相关文章:

c# - 调用时参数的数量或类型错误

c# - 安装项目的自动增量版本

java - 是否可以跟踪控制外部程序的线程的进度?

java - N 个重复任务的多线程架构

java - 什么时候方便使用 Executors.newSingleThreadExecutor() 的例子

multithreading - 如何从非 tcl 线程异步调用 Tcl 线程中的命令?

c# - 在重定向页面上执行 GET/POST 时,如何让 HttpWebRequest.AllowAutoRedirect 设置 cookie?

c# - 如何在 WPF C# 应用程序中使用 SlimDX

javascript - Angular 未定义的多个文件上传

python - 异步提要解析器请求