在单独的线程中运行同步http请求或只运行异步http请求更好吗?

时间:2011-05-04 18:42:04

标签: c# .net

从技术上讲,它是一样的。在单独的线程中运行同步例程实际上是异步运行它。但是真的有什么不同,哪个更好?

5 个答案:

答案 0 :(得分:1)

使用方法的异步版本。它们已经过优化以使用最少量的资源,并且如果需要,将有效地创建新线程 。通常,大多数异步方法最终都会在线程池中执行,这通常是一件好事。

答案 1 :(得分:1)

绝对是异步。

  

技术上也是一样的。

不,不是。因为同步方法会阻塞线程,从而使其无法用于任何不同的工作。异步释放线程,因此它可以执行不同的工作。当异步完成时,它使用新线程。

虽然这不是简单的同步/异步调用的问题。当您运行数十次或数千次调用时,使用异步非常有益。并且你可以使用异步在同一时间并行生成更多的调用,因为这是由操作系统和框架本身处理的。如果您想并行运行调用,则需要编写自己的逻辑。

答案 2 :(得分:1)

使用Async方法告诉框架使用IO Completion Ports来通知套接字,然后当IO完成时,它会在线程池上运行完成例程。

虽然使用了多线程,但它的使用非常有效,无需为此目的创建额外的线程,也无需等待线程等待IO完成。

相比之下,经典的每线程连接机制创建一个新的新线程,用于等待IO完成的特定目的,这是对资源的真正浪费。

虽然在简单的情况下两种方法之间的性能差异不明显,但当您尝试向上扩展时,真正的差异会显现出来。由于增加的开销,使用高于几千(甚至几百)个并发连接的每个连接模型获得不错的性能非常困难。

答案 3 :(得分:0)

异步请求针对此类行为进行了优化,并且需要较少的心理体操。

答案 4 :(得分:0)

如果您创建一个单独的线程来同步运行请求而不是调用异步版本,则成功运行异步请求

在循环中执行此操作,并且成功终止了正在运行代码的服务器

然后你将开始创建自己的线程池,同步机制等,以避免这种情况。

你可以说你已经重新发明了轮子,微软在你之前创造了:)