2013-07-02 64 views
0

.NET提供了异步模式--IAsyncResult,BeginMethod(),EndMethod()。我只是想知道使用这个模式总是比使用相应的同步模式更好 - 只需调用Method()。异步模式总是比.NET中的同步模式好?

在处理UI的情况下,肯定使用异步模式胜过同步模式,因为在Method()中的作业完成时,其他任务可以在当前线程中处理。

但是,如果我们正在开发一个服务器。假设Method()进行数据库调用,并且在从数据库调用获取结果之前,处理Method()的当前线程无关。在这种情况下,我认为使用同步模式会比异步模式更好,因为我们可以节省异步模式所需的一些开销。

您认为如何?在所有情况下,即使对于服务器开发,使用异步模式总是比使用同步模式更好(从节约资源的角度来看)?

感谢

回答

2

但是,如果我们正在开发一个服务器是什么。假设Method()进行数据库调用,并且在从数据库调用获取结果之前,处理Method()的当前线程无关。在这种情况下,我认为使用同步模式会比异步模式更好,因为我们可以节省异步模式所需的一些开销。

如果异步方法调用是异步的,因为它在IO上等待,在服务器上使用异步方法是一个很大的胜利。服务器可以释放并重用等待异步方法调用完成的当前线程,该线程使用信号进行通知。

异步方法当方法是IO绑定时可以显着提高服务器的可伸缩性。

如此说来,我将引导从IAsyncResultAPM远,而是使用基于任务的异步模式(单一方法返回Task<T>)与由语言在C#提供的新composibility特征组合5(async/await关键字)。这些在异步实现服务器端方法时特别好,因为使用与同步方法几乎相同的控制流来完成返回Task<T>await的方法。

+0

感谢您的回复。你认为即使在服务器编程中,“等待”也是非常有用的吗?在我的情况下,大多数情况下,调用流程无法继续进行I/O调用(例如数据库调用),因此task.Wait()(这里,您可以认为task = Task.Factory.StartNew(Method )))经常用来代替await。 – soleiljy

+0

@soleiljy:'await'对于服务器编程非常有用,但只有当你使用_everywhere_(如果顶级方法返回任务)。它可以让你在不浪费线程的情况下等待操作。你永远不应该调用Wait()。 – SLaks

+0

@soleiljy您应该(几乎)从不在服务器编程中使用'Task.Factory.StartNew',但'await' /'async'非常有用。关键是让服务器方法本身异步,所以等待释放线程。 –