2012-11-13 146 views
0

假设你有ConcurrencyMode多VS异步/等待

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple, 
    UseSynchronizationContext = false)] 

不使用这个实现下服务操作的异步/ AWAIT模式有什么区别WCF服务?即使不使用异步/等待,服务调用也不会异步地执行并可能执行?即使阅读了大量的msdn和博客文章,上述情况仍然不清楚,我会将我的操作异化为安全。

回答

5

即使没有使用async/await,服务调用是否会被汇集并可能异步执行?

编号ConcurrencyMode.Multiple将允许多个线程同时执行调用,但这不同于异步处理。

考虑一个单一的同步请求:单个线程将接收请求并一直执行直到它完成。如果该线程阻塞,那么您有阻塞的线程等待该请求完成。您可以指定ConcurrencyMode.Multiple以允许其他线程进入并进行其他呼叫而不会阻止其他请求。

现在考虑一个单独的异步请求:单个线程将接受请求并开始执行它。该线程将“等待”,而不是阻塞,这会将线程返回到线程池,直到异步操作完成。这意味着该请求上没有阻塞线程。当方法在其await后恢复时,线程池中的某个线程将用于继续请求(最终其中一个线程将完成请求)。

底线是服务器端的async允许比同步代码更大的规模,因为异步操作的开销比线程低。

ConcurrencyMode处理一个不同的问题:它是关于您的服务实现是如何线程安全的。如果您可以同时有多个呼叫,则应指定ConcurrencyMode.Multiple。如果你有自然的异步操作,你应该使它们成为async。如果你是线程安全的自然是异步的,你应该同时执行这两个操作。