【问题标题】:Threading Issue with WCF ServiceWCF 服务的线程问题
【发布时间】:2011-11-22 09:16:08
【问题描述】:

我对 WCF 和线程都是新手,所以请多多包涵。我设置了 WCF 服务。该服务有多个线程,所有线程都作用于单个数组。到目前为止,这没有问题。然而,这个服务有一个方法,当被调用时,它会返回数组。我的问题:

  1. 数组在通过 WCF 传输到客户端时被序列化。这是线程安全的操作吗?换句话说,我可以指望 WCF 在序列化时阻止所有线程访问该数组吗?

  2. 如果我不能指望 WCF 做到这一点,那么我该如何手动实现呢?我真的不明白 WCF 将如何促进这一点,因为序列化发生在我从方法调用返回之后。如何保证一个线程在我的方法返回后但在 WCF 序列化它之前不会修改数组?

【问题讨论】:

    标签: c# multithreading wcf thread-safety


    【解决方案1】:

    不,WCF 运行时不会为您锁定数据。即使可以,也不能阻止您在另一个线程中访问该数组。

    我认为获得此线程安全的唯一可能是在离开函数之前复制您在私有变量中返回的数据:

    string[] Servicemethod()
    {
      lock(myLock)
      {
          byte[] localCopy = new byte[myData.Length]; 
          Array.Copy(myData, localCopy, myData.Length);
          return localCopy;
      }
    }
    

    编辑

    如果不是复制大型数据结构的选项,则另一个选项可能是不返回数组,而是返回实现 ISerializable 的自定义类的实例。

    这样您就可以自己编写数据的线程安全序列化。

    但在此之前,我会衡量额外副本的影响。

    【讨论】:

    • 我担心这是可能的。我正在处理的数组非常大,并且多次复制它会增加一些严重的性能损失,即使它很快就会被序列化。还有其他想法吗?
    • 太棒了。感谢您的回答。
    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多