1

Androidエミュレーターを使用したMonoDevelop/C#テストを使用して、Android(およびそれ以降のiphone)用のアプリを開発しています。

タイムアウトしたとき(またはWeb接続がないとき)にコールバックを取得したいWebRequestがあります。最初は、インターネット接続がダウンしている場合、タイムアウトやコールバックは発生しませんでした。これが私がそれを解決しようとした方法です:

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

正しくは、ScanTimeoutCallbackが5秒後に呼び出されました(インターネットのプラグを抜いたとき)。ただし、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)
    { ... }
4

1 に答える 1

1

例外はタイムアウトではなく、EndGetResponseハンドラーによってスローされました。

ハンドラーで例外を処理する必要があります。

try
{
    using (HttpWebResponse response ...)
    {
       ...
    }
}
catch (System.Net.WebException)
{
    // handle the exception here
}
于 2013-03-05T17:42:08.960 に答える