2016-01-29 18 views
7

Tôi có một httpclient như thế này:Tại sao cuộc gọi HttpClient.PostAsync đầu tiên cực kỳ chậm trong ứng dụng C# winforms của tôi?

var client = new HttpClient(); 

tôi đăng lên lớp học như thế này:

var result = client.PostAsync(
       endpointUri, 
       requestContent); 

Và nhận được phản ứng như thế này:

HttpResponseMessage response = result.Result; 

Tôi hiểu cuộc gọi này sẽ chặn các chủ đề, thats làm thế nào nó phải làm việc (chỉ cần xây dựng một công cụ cho bản thân mình, không có chủ đề không đồng bộ cần thiết)

Lần đầu tiên tôi thực hiện cuộc gọi này, mất khoảng 2 phút để nhận kết quả. Trong khi đó, nếu tôi thực hiện cuộc gọi chính xác ở nơi khác, nó được thực hiện trong 200ms. Ngay cả khi tôi nhấn google, nó mất 2 phút. Nhưng, sau cuộc gọi đầu tiên, miễn là tôi tiếp tục mở ứng dụng, mọi cuộc gọi bổ sung đều tốt. Nó chỉ là cal đầu tiên khi tôi mở ứng dụng. Điều gì có thể gây ra điều này?

+1

Tôi sẽ bắt đầu bằng cách sử dụng '.ContinueWith' thay vì' .Result' (sử dụng 'async/await' ...) - ngoài việc này tôi không thấy gì cả có thể gây ra sự chậm trễ đó và thành thật mà nói tôi nghi ngờ rằng vấn đề nằm ở một nơi khác – Carsten

+0

Điều này sẽ dễ dàng nếu chúng tôi có một ngăn xếp để xem xét. Sử dụng WebClient mới(). Tải xuốngString() cho mục đích thử nghiệm, tạm dừng trình gỡ lỗi trong khi tạm dừng và đăng ngăn xếp cuộc gọi bao gồm cả mã bên ngoài. Nó có thể nói điều gì đó về DNS hoặc proxy. – usr

+1

Tôi không thể đoán được nhưng tôi sẽ bắt đầu bằng cách loại trừ khả năng thực hiện nó đồng bộ là vấn đề. HttpClient được thiết kế để không đồng bộ và có những cảnh báo mạnh mẽ về việc sử dụng nó theo kiểu bị chặn. 'kết quả chờ đợi 'chỉ đơn giản là' result.Result' vậy tại sao lại chống lại việc sử dụng nó một cách chính xác? –

Trả lời

11

Vấn đề là nó đã được treo trong một thời gian rất dài cố gắng để giải quyết một proxy cho khách hàng. Việc khởi tạo HttpClient như thế này đã thực hiện thủ thuật:

var client = new HttpClient(new HttpClientHandler 
      { 
       UseProxy = false 
      }); 
+0

Thx rất nhiều cho câu trả lời. Tôi đã gặp vấn đề tương tự với Nhận yêu cầu. –

+0

Tôi gặp vấn đề tương tự, yêu cầu mất 40ms trong lần thử thứ hai và được đo bằng fiddler mất 1-2,5 giây (xem xét thời lượng yêu cầu rất lớn) lần đầu tiên ngay cả với phiên bản mới của HttpClient. Thiết lập UseProxy = false không giúp được gì. –

Các vấn đề liên quan