MessageBuffer.CreateMessage是抽象的,所以詢問它是否線程安全沒有意義。 WCF中的MessageBuffer的子類都是內部的,所以它們可能會被更改。正如Chandermani所說,你應該假設它不是線程安全的。
更新:它不是線程安全的。創建的消息可能依賴於其他組件,例如消息體的序列化。如果這些組件不是線程安全的,那麼CreateMessage
調用也不能被認爲是線程安全的。
在下面的例子中,對象的序列化版本是時間依賴的(它也可能有一些額外的依賴關係),所以CreateMessage
調用的順序影響結果。
public class StackOverflow_6209650_751090
{
[DataContract]
public class MyDC
{
[DataMember]
public DateTime SerializedTime
{
get { return DateTime.Now; }
set { }
}
}
public static void Test()
{
Message message = Message.CreateMessage(MessageVersion.None, "foo", new MyDC());
var buffer = message.CreateBufferedCopy(int.MaxValue);
Console.WriteLine(buffer.CreateMessage());
Console.WriteLine();
Console.WriteLine(buffer.CreateMessage());
}
}
我們的服務維護多個MessageBuffers。這些緩衝區用於頻繁創建消息。 我想避免每個CreateMessage調用的同步構造開銷(除非,當然,CreateMessage調用不可重入) – ServerCode 2011-06-02 20:59:39
您將獲得圍繞創建消息添加同步構造的方法。 CreateMessage不會改變原始對象的狀態,所以如果創建消息被調用一次或多次,它如何起作用。 – Chandermani 2011-06-03 04:22:38
如果該方法不可重入(如您所想的那樣),則需要添加同步結構以確保該方法不會同時由兩個不同線程執行 – ServerCode 2011-06-06 01:59:30