簡體   English   中英

在超時/無連接時正常終止WebRequest

[英]Gracefully abort WebRequest on TimeOut/No connection

我正在使用Android模擬器通過MonoDevelop / C#測試開發用於Android(和更高版本的iphone)的應用。

我有一個WebRequest,當它超時(或沒有Web連接)時,我想獲得一個回調。 起初,如果互聯網連接斷開,我沒有超時或回調。 這是我嘗試解決的方法:

private void setupTimeOut (IAsyncResult result, RequestState state)
{
    ThreadPool.RegisterWaitForSingleObject (
        result.AsyncWaitHandle,
        new WaitOrTimerCallback (ScanTimeoutCallback),
        state,
        (5 * 1000),  // 5 second timeout
        true
    );
}

正確地,ScanTimeoutCallback在5秒鍾后被調用(當我拔掉Internet時)。 但是ScanTimeout確實拋出了此異常:

UNHANDLED EXCEPTION: System.Net.WebException: Aborted.
at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult) <0x00160>
at MyApp.ServerService.extractResponseAndCallDelegateOnError  
  (System.Net.WebRequest,System.IAsyncResult) <0x0003b>

以及ScanTimeoutCallback的代碼:

private static void ScanTimeoutCallback (object state, bool timedOut)
{ 
    if (timedOut)
    {
        Console.Out.WriteLine ("timedOut");
        RequestState reqState = (RequestState)state;
        if (reqState != null)
        {
            reqState.Request.Abort ();
            //Call my UI callback
        }
    }
}

BeginGetResponse:

IAsyncResult result = request.BeginGetResponse (o => {
context.Post (_ => {
    onLogin (o); }, null);
}, state);

setupTimeOut (result, state);

EndGetResponse:

using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result) as HttpWebResponse)
    { ... }

異常不是由超時引發的,而是由EndGetResponse處理程序引發的。

您需要在處理程序中處理異常:

try
{
    using (HttpWebResponse response ...)
    {
       ...
    }
}
catch (System.Net.WebException)
{
    // handle the exception here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM