2013-06-13 5 views
7

Я заметил, что когда я использую Protobuf-сеть в многопоточном контексте, как правило, не в состоянии периодически со следующей ошибкой:Является ли protobuf-net нить безопасной?

System.TimeoutException: Timeout while inspecting metadata; this may indicate a deadlock. 
This can often be avoided by preparing necessary serializers during application initialization, rather than allowing multiple threads to perform the initial metadata inspection 

Однако, если заблокировать доступ к Protobuf-нетто сериализатору первом время определенного типа сериализуется, оно работает без сбоев.

Является ли protobuf-net предназначенным для потокобезопасности, или это просто ошибка?

+0

То, что вы описали очень редко; если у вас есть объектная модель, которая воспроизводит это (даже если только 1 из 100 раз), мне бы хотелось взглянуть на нее, чтобы увидеть, что такое «вверх», –

ответ

12

Проверка метаданных Protobuf не является потокобезопасной. Эта ошибка «редка», но происходит много в огромных сериализации, которые выполняются параллельно. У меня была эта точная ошибка в моем проекте, где я сериализую около 70 миллионов объектов. Вы можете исправить это путем создания метаданных ВПЕРЕД сериализации:

Serializer.PrepareSerializer<YourCustomType1>(); 
Serializer.PrepareSerializer<YourCustomType2>(); 

ли этот код где-то впереди сериализации, возможно, статический конструктор, для каждого из пользовательских типов, которые упорядочиваются.

Вы также можете попытаться увеличить инспекционного метаданные таймаут Protobuf, чтобы попытаться помочь вам, но в случае истинного тупика в коде Protobuf это действительно просто задерживает ваше исключение:

// Initialize Protobuf Serializer for 5 minutes of wait in the case of long-waiting locks 
RuntimeTypeModel.Default.MetadataTimeoutMilliseconds = 300000; 
Смежные вопросы