.NET:JsonMediaTypeFormatter线程安全吗?

时间:2016-03-17 17:56:35

标签: c# asp.net .net json multithreading

以下代码很慢,因为它会在每次运行时生成动态序列化类:

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实际上是线程安全的任何好的来源或指示?

2 个答案:

答案 0 :(得分:1)

我相信自动生成的文档只会在大多数类中使用该常用短语。

序列化程序/格式化程序通常以可以从不同线程重用的方式设计。线程安全标准是他们不会以不安全的方式更新任何实例变量。您可以随时使用ildasm,ilspy或任何其他.net反编译工具来确保它。

例如,您的JsonMediaTypeFormatter.WriteToStreamAsync()只读取实例属性并调用静态方法。唯一的例外是在_dataContractSerializerCache.GetOrAdd()GetDataContractSerializer()调用(仅在启用UseDataContractJsonSerializer时),但由于_dataContractSerializerCacheConcurrentDictionary,因此它也是安全的,因此线程 - 安全的设计。

因此JsonMediaTypeFormatter没有理由让线程不安全。

P.S。另一方面,我不知道缓存JsonMediaTypeFormatter将如何提高性能,因为在构造函数内部没有繁重的工作,只有一些字段&#39;初始化。与序列化本身和网络I / O开销相比,它应该可以忽略不计。

答案 1 :(得分:0)

在我努力寻找导致我的代码出现性能问题的原因之后,我做了一个要点,以证明性能问题在哪里:

https://gist.github.com/anonymous/6c47b4138595e13f53c162d1c69ba0ed (copy-n-paste使得gist在最后一个元组中使用静态方法两次)。

问题在于使用DataContractJsonSerializer生成的读/写代码。

另外,我在Mictosoft文档和互联网上都没有找到任何有关此问题的官方文档。

感谢您指引我们朝着正确的方向前进。我不知道是否可行,但您可以编辑问题标题并在其中添加效果问题。