以下代码很慢,因为它会在每次运行时生成动态序列化类:
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
实际上是线程安全的任何好的来源或指示?
答案 0 :(得分:1)
我相信自动生成的文档只会在大多数类中使用该常用短语。
序列化程序/格式化程序通常以可以从不同线程重用的方式设计。线程安全标准是他们不会以不安全的方式更新任何实例变量。您可以随时使用ildasm,ilspy或任何其他.net反编译工具来确保它。
例如,您的JsonMediaTypeFormatter.WriteToStreamAsync()
只读取实例属性并调用静态方法。唯一的例外是在_dataContractSerializerCache.GetOrAdd()
内GetDataContractSerializer()
调用(仅在启用UseDataContractJsonSerializer
时),但由于_dataContractSerializerCache
是ConcurrentDictionary
,因此它也是安全的,因此线程 - 安全的设计。
因此JsonMediaTypeFormatter
没有理由让线程不安全。
P.S。另一方面,我不知道缓存JsonMediaTypeFormatter
将如何提高性能,因为在构造函数内部没有繁重的工作,只有一些字段&#39;初始化。与序列化本身和网络I / O开销相比,它应该可以忽略不计。
答案 1 :(得分:0)
在我努力寻找导致我的代码出现性能问题的原因之后,我做了一个要点,以证明性能问题在哪里:
https://gist.github.com/anonymous/6c47b4138595e13f53c162d1c69ba0ed (copy-n-paste使得gist在最后一个元组中使用静态方法两次)。
问题在于使用DataContractJsonSerializer生成的读/写代码。
另外,我在Mictosoft文档和互联网上都没有找到任何有关此问题的官方文档。
感谢您指引我们朝着正确的方向前进。我不知道是否可行,但您可以编辑问题标题并在其中添加效果问题。