2016-03-17 162 views
3

下面的代碼是緩慢的,因爲它在每次運行時產生的動態序列化類:.NET:JsonMediaTypeFormatter線程安全嗎?

var formatter = new JsonMediaTypeFormatter(); 
... // configure formatter 

MyDocument value = new MyDocument(); 
HttpContent content = new ObjectContent<MyDocument>(value, formatter); 
await httpClient.PutAsync(url, content); 

理想我應該緩存formatter值,但是我使用的線程和documentation說實例成員不是線程安全的。這聽起來像一個設計缺陷或不精確的文檔,因爲媒體類型格式化程序can be used as ASP.NET content parsers(顯然是線程感知的)。儘管如此,它並不排除ASP.NET使用鎖來避免併發訪問的可能性。

你是否知道JsonMediaTypeFormatter實際上是線程安全的任何好的消息來源或指示?

回答

1

我相信自動生成的文檔只是對大多數類使用該常用短語。

串行器/格式化程序通常設計爲可以從不同線程重用的方式。線程安全標準是它們不會以不安全的方式更新任何實例變量。你可以使用ildasm,ilspy或其他任何.net反編譯器工具來確保它。

例如,您的JsonMediaTypeFormatter.WriteToStreamAsync()只讀取實例屬性並調用靜態方法。唯一的例外是GetDataContractSerializer()內的_dataContractSerializerCache.GetOrAdd()呼叫(僅在啓用UseDataContractJsonSerializer時),但它也是安全的,因爲_dataContractSerializerCacheConcurrentDictionary,因此在設計上是線程安全的。

所以沒有理由JsonMediaTypeFormatter線程不安全。

P.S.另一方面,我看不到緩存如何提高性能,因爲在構造函數中沒有繁重的工作,只是一些字段的初始化。與序列化本身和網絡I/O開銷相比,它應該可以忽略不計。

+1

perf的問題不在構造函數上。在它第一次進行序列化時,它會創建產生大量動態代碼的數據協定序列化程序。如果我們不重用實例,它會每次都這樣做。 – fernacolo

0

後,我在努力尋找什麼引起我的代碼的性能問題,我做了一個依據來證明表現在哪裏的問題是:

https://gist.github.com/anonymous/6c47b4138595e13f53c162d1c69ba0ed (複印件正膏構成要點用靜態方法兩次在最後一個元組中)。

問題出在使用DataContractJsonSerializer讀取/寫入的代碼中。

此外,我沒有在Mictosoft文檔和互聯網上找到任何有關此問題的官方文檔。

感謝您指引我們在正確的方向。我不知道是否有可能,但是您可以編輯問題標題並在其中添加性能問題。