【问题标题】:ConcurrencyMode Multiple vs Async/AwaitConcurrencyMode Multiple vs Async/Await
【发布时间】:2012-11-02 00:10:24
【问题描述】:

假设你有一个 WCF 服务

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

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

【问题讨论】:

    标签: .net wcf asynchronous async-await


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2017-05-10
      • 2019-05-10
      相关资源
      最近更新 更多