Với sự thiếu rõ ràng hỗ trợ sẵn cho thời gian chờ IHttpAsyncHandler, có lẽ bạn phải quản lý thời gian chờ của riêng mình. Có lẽ đây là do thiết kế; sau khi tất cả các bạn đang lựa chọn một mô hình không đồng bộ - những người không MSFT nghĩ rằng họ đang cố gắng thiết lập một thời gian chờ mặc định cho nhiệm vụ chạy dài của bạn?
Điều tôi sẽ làm là sử dụng ThreadPool.RegisterWaitForSingleObject để quản lý cuộc thăm dò của bạn với thời gian chờ phù hợp. Đây là một mẫu mã tôi sử dụng để tránh phải chờ đợi vào một dịch vụ web mà không bao giờ trở lại:
private const int REQUEST_TIMEOUT = 30000; // miliseconds (30 sec)
private void CallService()
{
try {
string url = "somewebservice.com";
WebRequest request = WebRequest.Create(url);
// Asynchronously fire off the request
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(MyRoutineThatUsesTheResults), request);
// Handle timed-out requests
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(RequestTimeout), request, REQUEST_TIMEOUT, true);
}
catch (Exception ex) {
_logger.Error("Error during web service request.", ex);
}
private void RequestTimeout(object state, bool timedOut)
{
if (timedOut) {
WebRequest request = (WebRequest)state;
_logger.WarnFormat("Request to {0} timed out (> {1} sec)", request.RequestUri.ToString(), REQUEST_TIMEOUT/1000);
request.Abort();
}
}
Bạn sẽ cần một IAsyncResult để làm việc với phương pháp này nhưng đó là một mô hình thành lập bạn không nên có khó khăn khi chạy xuống mẫu về .
Ngoài ra, bạn sẽ gặp sự cố khi IIS quyết định tái chế nhóm ứng dụng/rách miền ứng dụng của bạn trong khi bỏ phiếu vẫn đang chạy. Nếu đó là điều kiện bạn muốn xử lý, bạn có thể sử dụng HostingEnvironment.RegisterObject.
Tôi khuyên bạn nên tìm hiểu lý do tại sao mã của bạn chạy lâu hơn bạn muốn và có kiểm tra định kỳ trong đó để ngừng thực thi và trả lại mã cho đến thời điểm này, nếu có thể. –
@ andrew-barber Tôi đang sử dụng IHttpAsyncHandler để chia sẻ dài (để thông báo psuh cho khách hàng). Đó là nghĩa vụ phải có thời gian chạy dài, nhưng tôi vẫn muốn có một thời gian chờ. – Adir