似乎缺乏对 IHttpAsyncHandler 超时支持的内在支持, 假设你必须管理自己的超时。 也许这是自作自受的; 毕竟你选择的是非同步模式 — MSFT认为谁在试图为您长期运行的任务设定默认超时?
我要做的是使用 < a href=> "http://msdn.microsoft.com/ en- us/library/ system.threading.threadpool.registerwait forsingleobject.aspx" rel="noreferrer">Threadpool.Register WaitForSingleObject 来管理您的投票。 我用一个代码样本来避免在永远不返回的网络服务上等待 :
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();
}
}
您需要使用 IAsyncResult 来使用这个方法, 但是这个模式已经确定, 您不应该有麻烦 运行样本 。
此外,当IIS决定回收您的应用程序池/ 撕掉您的应用程序域时, 您还会遇到问题。 如果您的投票仍然在运行中, 您可以使用 < a href=" http://haacked.com/ archive/2011/10/16/ the-dangers- complication- recent- black- ground- tasks- in- asp- net.aspx" rel= “ noreferr” >hosting Environment. RegisterObject 。