DataContractSerializer
의 단일 인스턴스를 동시에 캐시하여 동일한 루트 유형에 대해 여러 번 serializer를 인스턴스화하는 페널티를 피하기 위해 여러 스레드에서 동시에 사용하려고합니다. 각 스레드는 다른 객체를 직렬화 할 것이지만 DataContractSerializer
객체 자체가 공유됩니다. (IDataContractSurrogate
또는 DataContractResolver
을 사용하지 않을 것입니다. 이는 더 복잡한/공식 XML/XSD 스키마와 관련이있는 것 같습니다.)System.Runtime.Serialization.DataContractSerializer 스레드가 안전합니까?
괜찮습니까?
In MSDN under "Thread Safety" for System.Runtime.Serialization.DataContractSerializer, 그것은 말한다 :이 클래스의
인스턴스는 스레드 인스턴스가 IDataContractSurrogate 또는 DataContractResolver의 구현에 사용 인 경우를 제외하고 안전합니다.
이 항목은 다소 모호합니다 (MSDN 스레드 안전 지침의 일반적인 내용). 그러나 사용 사례가 적절하다는 것을 나타내는 것 같습니다. 보너스 당신이 개인적인 경험, 단위 테스트, 또는 그것을 설명하는 프레임 워크 해체를 가리킬 수 있다면 보너스 :
추신. 그 사람의 이슈가 DataContractSerializer
자체의 스레드 안전과 관련이없는 것으로 판명 되었기 때문에 이것이 Is WCF's DataContractSerilaizer thread safe?의 중복이라고 생각하지 않습니다.
단위 테스트 또는 개인 경험을 사용하여 스레드로부터 안전하다는 것을 증명할 수는 없습니다. 당신은 ** 무언가 ** 스레드 안전하지 않다는 것을 증명하기 위해 사용할 수 있습니다. 그러나 반드시 필요하지는 않습니다. –
말하기 어렵습니다. 스레드에서 메가 바이트를 구울 때 킬로바이트 복사본을 저장할 필요가 없습니다. –
@MarcGravell 나는 이론 *에서 하나의 단위 테스트로 스레드 안전성을 증명할 수 없다고 생각한다. 궁극적으로 튜링 중단/완전성 문제 때문이다. 하지만 제 경험상 대부분의 스레드 안전 문제는 몇 분 동안 정말 강렬한 멀티 스레딩을 수행하고 어떤 종류의 손상을 찾을지를 알 수있는 단위 테스트로 재현 될 수 있습니다. 누군가가 이미 테스트를 작성하거나 프레임 워크 디스 어셈블리를 읽는 데 어려움을 겪고 있기를 바랄뿐입니다. –