【问题标题】:WCF: Make all calls wait when one specific interface is being calledWCF:在调用一个特定接口时让所有调用等待
【发布时间】:2010-11-29 20:18:00
【问题描述】:

我有一个 WCF 服务,它有很多只读取数据的接口。然而,有一个接口可以从数据库重新加载数据并重新初始化一些字典。当这个界面“重新加载”正在运行时,我实际上希望所有其他调用都被“搁置”,因为它们会读取未知状态的数据(因为我正在使用每次调用)

[ServiceContract]
public interface IMyObject
{
    [OperationContract] 
    string Reload();
    [OperationContract]
    string Read1();
    [OperationContract]
    string Read2();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class MyObject : IMyObject
{
    public string Reload() { //Takes 5-10secs, called twice a day  }
    public string Read1() {  //Wait for Reload() to finish if it's running}
    public string Read2() {  //Wait for Reload() to finish if it's running} 
}

这在 WCF 中可行吗?或者有解决这个问题的最佳实践方法吗?

【问题讨论】:

    标签: c# wcf web-services concurrency


    【解决方案1】:

    我相信,如果您使用 ConcurrencyMode 并将其设置为单一,您可以实现您想要的。

    话虽如此,我已经实现了你想要的,我的服务上有一个标志。如果您设置了静态标志,其他调用可以检查该标志并执行您希望他们执行的操作

    【讨论】:

      【解决方案2】:

      建议你:

      1. 将 InstanceContextMode.PerCall 更改为 InstanceContextMode.Single
      2. 然后添加 ConcurrencyMode = ConcurrencyMode.Multiple(一次允许执行 1 次以上)
      3. 在您的 MyObject 实现中手动处理并发。使用简单的lock 或高级机制,例如ReaderWriterLockSlim

      带锁的实现如下:

      [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
      class MyObject: IMyObject
      {
          private readonly object lockObject = new object();
          public string Reload()
          {
              lock (lockObject)
              {
                  // Reload stuff
              }
          }
          public string Read1()
          {
              lock (lockObject)
              {
                  // Read1 stuff
              }
          }
      
          public string Read2()
          {
              lock (lockObject)
              {
                  // Read2 stuff
              }
          }
      }
      

      缺点,它不允许您同时调用 Read1 和 Read2。如果您需要此功能,请使用 ReaderWriterLockSlim 而不是 lock。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多