为什么使用APM而不是使用单独的线程?

时间:2009-04-10 05:42:38

标签: c# .net multithreading asynchronous

如果我想读取或写入文件,我可以使用stream.BeginRead和stream.EndRead,但这需要使用异步编程模型进行回调和大量丑陋复杂的代码。

为什么我要使用这些异步IO方法(在后台使用.NET线程池),而不是以同步方式编写相同的代码,并将 传递给线程池。 (而不是用回调来削减我的方法。)

更新

一些(好的)响应表明使用APM使我无法创建一个线程 - 我同意这一点,因为新线程每个都有自己的2MB堆栈。但'BeginRead'和'Endread'在哪里执行?线程池?重用已经分配了唯一好处的线程吗?

3 个答案:

答案 0 :(得分:6)

首先,您还应该查看Event-based APM

要回答您的问题,您可能正在考虑使用单独的线程并进行同步调用。另一个线程将阻止等待调用完成。

使用APM,根本没有线程阻塞。线程池没有绘制。这对于像ASP.NET这样的服务器应用程序尤其重要,因为这意味着阻塞线程不会阻止处理请求。

答案 1 :(得分:2)

Jeff Richter有一个非常聪明且干净的way来使用APM。

答案 2 :(得分:1)

使用异步调用的好处是你不会在I / O上浪费线程阻塞。线程可能很昂贵,因此在你进行大量I / O的情况下,明智地使用线程是关键。

那就是说,是的,开始结束的APM非常糟糕。如果您确实需要非阻塞I / O并且可以灵活地为应用程序的一部分使用其他语言,请尝试使用F#。 “异步工作流程”使编写异步代码变得轻而易举。