2013-06-13 18 views
7

Zauważyłem, że gdy używam protobuf netto w wielowątkowych kontekście raczej nie przerywany z powodu następującego błędu:Czy wątek protobuf-net jest bezpieczny?

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 

Jednak gdybym zablokować dostęp do serializatora, pierwsza protobuf-net czas, w którym dany typ jest serializowany, działa bezawaryjnie.

Czy protobuf-net ma być bezpieczny dla wątków, czy jest to tylko błąd?

+0

co opisujesz jest bardzo rzadko spotykany; jeśli masz model obiektowy, który to powiela (nawet jeśli 1 na 100), chciałbym go obejrzeć, żeby zobaczyć, co jest "w górze" –

Odpowiedz

12

Inspekcja metadanych Protobuf nie jest bezpieczna dla wątków. Ten błąd jest "rzadki", ale zdarza się bardzo często w wielkich serializacjach wykonywanych równolegle. Miałem ten dokładny błąd w moim projekcie, w którym serializuję około 70 milionów obiektów. Można to naprawić poprzez generowanie metadanych wyprzedza serializacji:

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

Czy ten kod gdzieś na przodzie serializacji, może statyczny konstruktora, dla każdego z typów niestandardowych, które są w odcinkach.

Można również próbować zwiększyć limit czasu kontroli metadanych Protobuf by spróbować i pomagać wam, ale w przypadku prawdziwego impasu w kodzie Protobuf to naprawdę tylko opóźnia swój wyjątek:

// Initialize Protobuf Serializer for 5 minutes of wait in the case of long-waiting locks 
RuntimeTypeModel.Default.MetadataTimeoutMilliseconds = 300000; 
Powiązane problemy