【问题标题】:How does WCF handle instancing and concurrency?WCF 如何处理实例化和并发?
【发布时间】:2015-04-10 13:53:14
【问题描述】:

我试图了解 WCF 如何处理实例化、并发和线程。

例如,如果我将实例上下文模式配置为 PerCall 并将并发模式配置为单一,则每个请求都会创建一个新的 WCF 服务实例。这与创建服务器端的线程有关是什么意思?

我猜想实例化和并发与线程无关。对于给定的示例,每个请求都由“主”I/O 线程池排队以由工作线程执行,这对吗?还是每个请求都创建了一个新的实例和线程来执行这个请求?

【问题讨论】:

  • 您要解决什么问题?
  • 我想知道它如何处理实例化、并发和线程,以便更好地理解 WCF。没有特别问题;)
  • 你用 WCF 做什么?网络服务?

标签: c# multithreading wcf concurrency


【解决方案1】:

如果我将实例上下文模式配置为 PerCall 和并发 模式为单曲,每个请求都会创建一个新的 WCF 实例 服务。这与创建的线程有关是什么意思 服务器端?

如果您使用 Per-Call 实例化,则服务实例都是单线程的,因为每个传入请求都由服务的新实例提供服务。所以在这种情况下指定并发性是不相关的。

我猜想实例化和并发性并不强相关 穿线

我不确定你是如何得出这个结论的。


在这篇文章下面的地址:

在 Per-Call 模式下,对于每个调用,我们都会创建一个 服务。如果我们处于单线程模式,则只有一个线程 处理这些实例,以便我们按顺序处理请求

这两种说法是矛盾的。如果我们为每个请求创建一个新实例,那么服务不会按顺序处理多个请求。它将为每个请求创建一个新实例。

(PerCall模式下)如果并发模式是多的,有很多线程在执行 实例方法,因此我们以并行方式服务请求

这是不正确的。多个请求将由各自的服务实例处理。

处理服务实例中的调用需要一个线程。调用处理代码很可能是多线程的,但这是服务内部的,WCF 并发模式不会影响调用处理代码的执行。

对该服务的其他调用将导致创建该服务的新实例。因此,虽然您当然可以将并发模式设置为多个,但您永远不会得到多个线程处理对服务实例的请求。

因此,将并发模式设置为多次调用实例不会对服务的行为产生任何实际影响。

【讨论】:

  • 我们可以根据上下文使用我们想要的组合。我还注意到,如果您选择并发模式“Multiple”,Per-Call 实例可以在多个线程中执行。
  • @hatem87 - 并发模式与服务调用的多线程执行无关。它与服务将服务多少呼叫有关。是的,您当然可以在每次调用场景中将并发模式设置为多个,但这不会有任何区别。服务实例将最多服务一个调用并且只服务一个调用。所以你的断言是不正确的。
  • 在 Per-Call 模式下,我们为每个调用创建一个服务实例。如果我们处于单线程模式,则有一个线程处理这些实例,因此我们以顺序方式处理请求。但是如果并发模式是多的,有很多线程在执行实例方法,所以我们以并行的方式服务请求。我希望我以正确的方式描述了发生的事情:)。谢谢。
  • @hatem87 - 这是不正确的。当您指定实例模式 PerCall 时,每次调用都有一个实例。处理对服务实例的调用需要一个线程。调用处理代码很可能是多线程的,但并发模式不会影响这一点。对该服务的其他调用将导致启动该服务的新实例。因此,虽然您可以设置多个并发模式,但您永远不会在一个服务实例中运行多个线程。因此它是不相关的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2015-03-11
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多