假设您有一个带
的WCF服务[ServiceBehavior(
IncludeExceptionDetailInFaults = true,
InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple,
UseSynchronizationContext = false)]
在此实现下使用async / await模式进行服务操作有何不同?即使没有使用async / await,也不会异步处理服务调用并可能异步执行?即使在阅读了很多msdn和博客文章之后,我仍然不清楚上述情况,我会将操作异步化为安全。
答案 0 :(得分:5)
即使没有使用async / await,服务调用也不会被异步并且可能异步执行吗?
没有。 ConcurrencyMode.Multiple
将允许多个线程同时执行调用,但这与异步处理不同。
考虑单个同步请求:单个线程将接受请求并一直执行它直到它完成。如果该线程阻塞,则您有一个被阻塞的线程等待该请求完成。您可以指定ConcurrencyMode.Multiple
以允许其他线程进入并执行其他调用而不会阻止其他请求。
现在考虑单个异步请求:单个线程将接受请求并开始执行它。该线程将“等待”而不是阻塞,该线程将线程返回到线程池,直到异步操作完成。这意味着该请求上没有阻塞线程。当方法在await
之后恢复时,线程池中的某些线程将用于继续请求(最终其中一个线程将完成请求)。
底线是服务器端的async
允许比同步代码更大的规模,因为异步操作的开销低于线程。
ConcurrencyMode
处理一个不同的问题:它是关于您的服务实现的线程安全性。如果您可以同时进行多个调用,则应指定ConcurrencyMode.Multiple
。如果您有自然的异步操作,则应该使它们async
。如果你的线程安全和自然是异步的,你应该同时做这两件事。