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)
{ ... }