1

假设您有一个 WCF 服务

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

在此实现下使用 async/await 模式进行服务操作有什么不同?即使不使用 async/await,服务调用是否会被合并并可能异步执行?即使在阅读了大量 msdn 和博客文章之后,上述场景对我来说仍然不清楚,我会异步化我的操作以确保安全。

4

1 回答 1

6

即使不使用 async/await,服务调用是否会被合并并可能异步执行?

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

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

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

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

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

于 2012-11-13T15:21:06.380 回答