2013-06-13 33 views
7

tôi đã nhận thấy rằng khi tôi sử dụng protobuf-net trong một bối cảnh đa luồng nó có xu hướng thất bại liên tục với các lỗi sau:Chủ đề protobuf-net có an toàn không?

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 

Tuy nhiên, nếu tôi khóa quyền truy cập vào các serializer protobuf-net là người đầu tiên thời gian một loại cụ thể được đăng, nó hoạt động mà không bị lỗi.

Mạng protobuf có phải là chỉ an toàn không, hoặc đây có phải là lỗi không?

+0

gì bạn mô tả là rất hiếm; nếu bạn có một mô hình đối tượng sao chép điều này (ngay cả khi chỉ có 1 trong 100 thời gian) tôi rất muốn có một cái nhìn vào nó để xem những gì là "lên" –

Trả lời

12

Kiểm tra siêu dữ liệu của Protobuf không an toàn. Lỗi này là "hiếm" nhưng xảy ra rất nhiều trong serializations rất lớn được thực hiện song song. Tôi đã có lỗi chính xác này trong dự án của tôi, nơi tôi sắp xếp hàng loạt khoảng 70 triệu đối tượng. Bạn có thể sửa chữa nó bằng cách tạo ra các siêu dữ liệu AHEAD của serialization:

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

Do mã mà ở đâu đó trước serialization, có lẽ một constructor tĩnh, đối với mỗi loại tùy chỉnh của bạn mà là tuần tự.

Bạn cũng có thể cố gắng tăng thời gian chờ kiểm tra siêu dữ liệu Protobuf để thử và giúp bạn, nhưng trong trường hợp của một bế tắc đúng trong các mã Protobuf này thực sự chỉ trì hoãn ngoại trừ của bạn:

// Initialize Protobuf Serializer for 5 minutes of wait in the case of long-waiting locks 
RuntimeTypeModel.Default.MetadataTimeoutMilliseconds = 300000; 
Các vấn đề liên quan