2017-04-26 14 views
9

Xem xét các phương pháp này hai bộ điều khiển:Các vấn đề có thể xảy ra nếu chúng ta chờ đợi hoạt động async dài trong ASP.NET Core?

public async Task DoAsync() { 
    await TaskThatRunsFor10MinutesAsync().ConfigureAwait(false); 
} 

public void DoWithTaskRunAndReturnEarly() { 
    Task.Run(() => TaskThatRunsFor10MinutesAsync()); 
} 

Hãy nói rằng về phía khách hàng, chúng tôi không quan tâm đến phản ứng. Chúng tôi có thể chờ cho đến khi hoàn thành, chúng tôi có thể từ bỏ người dùng nửa chừng để làm mới trang - nhưng không quan trọng là DoWithTaskRunAndReturnEarly sẽ trả về sớm hơn.

Có sự khác biệt quan trọng giữa phía hai máy chủ đó, ví dụ: về độ tin cậy, thời gian chờ, v.v ...? ASP.NET lõi có bao giờ hủy bỏ các chủ đề trên một thời gian chờ?

Trả lời

5

Trong ASP.NET Core 1.1, ổ cắm sẽ ở trạng thái CLOSE_WAIT cho đến khi ứng dụng Task hoàn tất. Điều đó có thể dẫn đến cạn kiệt tài nguyên ở phía máy chủ nếu bạn có nhiều tác vụ chạy dài trên máy chủ mà máy khách đã ngắt kết nối (làm mới trang trong trường hợp của bạn).

Có sự khác biệt quan trọng giữa phía hai máy chủ, ví dụ: về độ tin cậy, thời gian chờ, v.v ...? ASP.NET lõi có bao giờ hủy bỏ các chủ đề trên một thời gian chờ?

Hủy bỏ chủ đề không phải là "điều" trong .NET Core nữa và sẽ không hoạt động cho bất kỳ mã async nào (không có chủ đề hoạt động khi bạn đang chờ).

Trong phiên bản tiếp theo của ASP.NET Core (2.x tại thời điểm viết) kích hoạt mã thông báo hủy yêu cầu khi ổ cắm máy khách gửi FIN để bạn có thể phản ứng với khách hàng ngắt kết nối để hủy hoạt động lâu dài . Ngày đầu đó, nó sẽ đóng socket ngay cả trước khi ứng dụng hoàn tất.

+0

Nếu yêu cầu hủy bỏ CT sẽ đến trong v2, CT (phương thức được chuyển đến phương thức điều khiển) làm gì hôm nay? –

+1

Nó được trigged nếu khách hàng gửi một RST trong Kestrel hoặc nếu bạn trực tiếp gọi HttpContext.Abort – davidfowl

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