[英].NET: Is JsonMediaTypeFormatter thread safe?
以下代码很慢,因为它在每次运行时都会生成动态序列化类:
var formatter = new JsonMediaTypeFormatter();
... // configure formatter
MyDocument value = new MyDocument();
HttpContent content = new ObjectContent<MyDocument>( value, formatter );
await httpClient.PutAsync( url, content );
理想情况下我应该缓存formatter
值,但是我正在使用线程, 文档说实例成员不是线程安全的。 这听起来像是设计缺陷或不精确的文档,因为媒体类型格式化程序可以用作ASP.NET内容解析器 (显然是线程感知的)。 仍然不排除ASP.NET使用锁来避免并发访问的可能性。
您是否知道JsonMediaTypeFormatter
实际上是线程安全的任何好的来源或指示?
我相信自动生成的文档只是在大多数类中使用该常用短语。
序列化器/格式化程序通常以可以从不同线程重用的方式设计。 线程安全标准是它们不以不安全的方式更新任何实例变量。 您可以随时使用ildasm,ilspy或任何其他.net反编译工具来确保它。
例如,您的JsonMediaTypeFormatter.WriteToStreamAsync()
仅读取实例属性并调用静态方法。 唯一的例外是_dataContractSerializerCache.GetOrAdd()
内调用GetDataContractSerializer()
仅当UseDataContractJsonSerializer
启用),但它也是安全的,因为_dataContractSerializerCache
是ConcurrentDictionary
,因此线程安全的设计。
所以没有理由让JsonMediaTypeFormatter
成为线程不安全的。
PS另一方面,我没有看到缓存JsonMediaTypeFormatter
如何提高性能,因为在构造函数中没有繁重的工作,只是一些字段的初始化。 与序列化本身和网络I / O开销相比,它应该是可以忽略不计的。
在我努力寻找导致代码性能问题的原因后,我做了一个要点,以证明性能问题在哪里:
https://gist.github.com/anonymous/6c47b4138595e13f53c162d1c69ba0ed (拷贝n-paste使得gist在最后一个元组中使用静态方法两次)。
问题在于使用DataContractJsonSerializer生成的读/写代码。
此外,我在Mictosoft文档和互联网上都没有找到任何关于此问题的官方文档。
感谢您指引我们正确的方向。 我不知道是否可能,但您可以编辑问题标题并在其中添加性能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.