2011-11-22 49 views
2

我是WCF和線程的新手,所以請耐心等待。我有一個WCF服務設置。該服務具有多個線程,所有這些線程都作用於單個陣列。目前爲止這沒有問題。然而,這個服務有一個方法,當被調用時,它將返回數組。我的問題:線程問題與WCF服務

  1. 數組在通過WCF傳輸到客戶端時被序列化。這是一個線程安全操作嗎?換句話說,我可以指望WCF阻止所有線程在序列化時訪問此數組嗎?

  2. 如果我不能指望WCF做到這一點,那我該如何手動實現它?我不太瞭解WCF如何促進這一點,因爲序列化發生在我從我的方法調用返回後發生。我怎樣才能保證一個線程在我的方法返回之後但在WCF序列化之前不會修改數組?

回答

3

不,WCF運行時不會爲您鎖定數據。即使它會,它也不能阻止你在另一個線程中訪問數組。

我認爲唯一的possibilty得到這個線程是離開功能之前,你在一個私有變量返回的數據複製:

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

編輯

如果它不是一個選項,複製大型數據結構的另一種選擇可能是不返回數組,而是實現ISerializable的自定義類的實例。

這樣你就可以自己編寫一個線程安全的序列化數據。

但在此之前,我會測量額外副本的影響。

+0

我擔心這將是一種可能性。我正在處理的數組非常大,並且不止一次地複製它會增加一些嚴重的性能命中,即使它很快就會被序列化。任何其他想法? – LandonSchropp

+0

查看我的編輯... – Jan

+0

太棒了。感謝你的回答。 – LandonSchropp