WCF服务的线程问题

本文关键字:问题 线程 服务 WCF | 更新日期: 2023-09-27 18:15:19

我对WCF和线程都是新手,所以请原谅我。我设置了一个WCF服务。该服务有多个线程,所有线程都作用于单个数组。到目前为止,这个工作没有任何问题。但是,此服务有一个方法,当调用该方法时,将返回数组。我的问题:

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

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

WCF服务的线程问题

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

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

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

编辑

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

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

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