2013-06-13 6 views
7

Ich habe bemerkt, dass, wenn ich protobuf-net in einem Multi-Threaded-Kontext verwenden sie intermittierend mit dem folgenden Fehler fehlschlagen neigt:Ist protobuf-net thread sicher?

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 

Allerdings, wenn ich den ersten Zugriff auf die protobuf-net Serializer sperren Wenn ein bestimmter Typ serialisiert wird, funktioniert er ohne Fehler.

Ist protobuf-net threadsicher, oder ist das nur ein Fehler?

+0

Was Sie beschreiben, ist sehr Selten; Wenn Sie ein Objektmodell haben, das dies reproduziert (selbst wenn nur 1 zu 100), würde ich gerne einen Blick darauf werfen, um zu sehen, was "oben" ist. –

Antwort

12

Die Metadatenprüfung von Protobuf ist nicht threadsicher. Dieser Fehler ist "selten", kommt aber bei großen Serialisierungen vor, die parallel ausgeführt werden. Ich hatte genau diesen Fehler in meinem Projekt, wo ich ungefähr 70 Millionen Objekte serialisierte. Sie können das Problem beheben, indem Sie die Metadaten AHEAD der Serialisierung zu erzeugen:

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

dass Code Sie irgendwo vor der Serialisierung, vielleicht einen statischen Konstruktor, für jedes Ihrer benutzerdefinierten Typen, die serialisiert werden.

Sie können auch Sie versuchen Protobuf Metadaten Inspektion Timeout zu erhöhen versuchen und zu helfen, aber im Falle eines echten Deadlock im Code Protobuf dies wirklich verzögert nur Ihre Ausnahme:

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