ConcurrencyMode Multiple vs Async/Await

ins*_*pid 1 .net wcf asynchronous async-await

假设你有一个WCF服务

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple,
    UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)

在此实现下使用async/await模式进行服务操作有何不同?即使没有使用async/await,服务调用也不会被异步并且可能异步执行?即使在阅读了很多msdn和博客文章之后,上述情况对我来说仍然不明确,我会将操作异步化为安全.

Ste*_*ary 6

即使没有使用async/await,服务调用也不会被异步并且可能异步执行?

No. ConcurrencyMode.Multiple允许多个线程同时执行调用,但这与异步处理不同.

考虑单个同步请求:单个线程将接受请求并一直执行它直到它完成.如果该线程阻塞,则您有一个被阻塞的线程等待该请求完成.您可以指定ConcurrencyMode.Multiple允许其他线程进入并执行其他调用而不阻塞其他请求.

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

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

ConcurrencyMode处理一个不同的问题:它是关于您的服务实现的线程安全性.如果您可以同时进行多个调用,则应指定ConcurrencyMode.Multiple.如果你有自然的异步操作,你应该制作它们async.如果你是线程安全的并且自然是异步的,你应该同时做到这两点.