Câu hỏi ngắn:
Có ai khác gặp sự cố khi sử dụng đơn NET HttpClient nơi ứng dụng chốt bộ xử lý ở mức 100% cho đến khi khởi động lại không?.NET: Sử dụng CPU 100% trong HttpClient vì từ điển?
Chi tiết:
Tôi đang chạy Dịch vụ Windows liên tục ETL theo lịch biểu. Một trong các luồng đồng bộ hóa dữ liệu đôi khi chỉ chết hoặc bắt đầu chạy ngoài tầm kiểm soát và chốt bộ xử lý ở mức 100%.
Tôi đã may mắn thấy điều này xảy ra trực tiếp trước khi ai đó chỉ cần khởi động lại dịch vụ (sửa tiêu chuẩn) và có thể lấy tệp kết xuất.
Tải tệp này trong WinDbg (w/SOS và SOSEX), tôi thấy rằng tôi có khoảng 15 chủ đề (các nhiệm vụ phụ của chuỗi xử lý chính) tất cả đang chạy với các dấu vết ngăn xếp giống hệt nhau. Tuy nhiên, có vẻ như không có bất kỳ deadlocks. I E. các luồng sử dụng cao đang chạy, nhưng không bao giờ kết thúc.
Các liên quan stack-trace phân khúc sau (địa chỉ bỏ qua):
System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].FindEntry(System.__Canon)
System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].TryGetValue(System.__Canon, System.__Canon ByRef)
System.Net.Http.Headers.HttpHeaders.ContainsParsedValue(System.String, System.Object)
System.Net.Http.Headers.HttpGeneralHeaders.get_TransferEncodingChunked()
System.Net.Http.Headers.HttpGeneralHeaders.AddSpecialsFrom(System.Net.Http.Headers.HttpGeneralHeaders)
System.Net.Http.Headers.HttpRequestHeaders.AddHeaders(System.Net.Http.Headers.HttpHeaders)
System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage, System.Net.Http.HttpCompletionOption, System.Threading.CancellationToken)
...
[Our Application Code]
Theo this article (và những người khác tôi đã tìm thấy), việc sử dụng từ điển là không thread-an toàn, và vô hạn vòng có thể (như là các sự cố liên tiếp) nếu bạn truy cập từ điển theo cách đa luồng.
NHƯNG mã ứng dụng của chúng tôi không sử dụng từ điển một cách rõ ràng. Vậy từ điển được đề cập trong ngăn xếp theo dõi ở đâu?
Làm theo thông qua .NET Reflector, nó xuất hiện rằng HttpClient sử dụng từ điển để lưu trữ bất kỳ giá trị nào đã được định cấu hình trong thuộc tính "DefaultRequestHeaders". Bất kỳ yêu cầu nào được gửi qua HttpClient, do đó, kích hoạt một liệt kê một từ điển đơn lẻ, không an toàn (để thêm các tiêu đề mặc định vào yêu cầu), có khả năng quay vô hạn (hoặc giết) các chủ đề liên quan nếu một tham nhũng xảy ra.
Microsoft đã tuyên bố thẳng thắn rằng lớp HttpClient là an toàn chỉ. Nhưng có vẻ như với tôi như thế này là không còn đúng nếu bất kỳ tiêu đề đã được thêm vào DefaultRequestHeaders của HttpClient.
Phân tích của tôi dường như chỉ ra rằng đây là vấn đề gốc thực, và cách giải quyết đơn giản là không bao giờ sử dụng DefaultRequestHeaders nơi HttpClient có thể được sử dụng theo cách đa luồng.
Tuy nhiên, tôi đang tìm một số xác nhận rằng tôi không sủa cây sai. Nếu điều này là chính xác, nó có vẻ giống như một lỗi trong khung công tác .NET, mà tôi tự động có xu hướng nghi ngờ.
Xin lỗi vì câu hỏi dài dòng, nhưng cảm ơn mọi đầu vào bạn có thể có.
đây là tiêu chuẩn spiel của họ với chủ đề an toàn: "Bất kỳ công cộng tĩnh (được chia sẻ trong Visual Basic) thành viên của loại này là chủ đề an toàn. Bất kỳ thành viên dụ không được đảm bảo để được an toàn thread." –
vui lòng cung cấp [mcve] –
Tại sao làm cho ứng dụng khách của khách hàng trở thành một singleton? Dường như với tôi, bản sửa lỗi dễ nhất sẽ đơn giản là để mỗi thread tạo và sử dụng cá thể riêng của nó. – pquest