0

Windows8ストアクラスライブラリに移植するクラスライブラリがあります。メソッドの1つは、現在サポートされていない同期HttpWebRequestを使用します。非同期作業はライブラリではなくアプリケーションで行われているため、メソッドの同期を維持する必要があり、変更するには多大な労力が必要になります。IAsyncresultを使用した同期タスクに変更しましたが、このコードを使用してリクエストのタイムアウトを設定する方法がわかりません。誰かが助けることができますか?また、このコードで発生する可能性のある他の問題を誰かが見ることができますか?

//Create Web Request
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
IAsyncResult asyncResult = request.BeginGetResponse(null, null);

if (asyncResult.AsyncWaitHandle.WaitOne(5 * 1000))
{
    //Get Response
    using (HttpWebResponse response = request.EndGetResponse(asyncResult) as HttpWebResponse)
    {
        if (request.HaveResponse && response != null)
        {
            using (Stream reader = response.GetResponseStream())
            {
                result = XDocument.Load(reader);
            }
        }
    }
}
else
{
    request.Abort();
}

更新:リクエストにウェイトハンドルを追加しました。タイムアウトした場合は、httpwebrequestを中止します。これは、HttpWebRequestによって開始されたスレッドを処理しますか?

4

1 に答える 1

1

どうですか:

if(false == request.GetResponseAsync().Wait(DateTime.Now.AddMinutes(2.0)))
{
    Trace.WriteLine("timeout");
    return;
}
//...

ここで、これは単に非同期操作を待機するためのタイムアウトであることを覚えておいてください。特に応答/要求ストリーム操作のタイムアウトに対処するには、 を参照してくださいHttpWebRequest.Timeout

メソッドでasync/awaitを使用する必要はありません。それらは、操作できるオブジェクトを*Async返し、 、 などのメソッドを使用するだけです... / (APM パターン)を処理するよりもはるかに簡単です...Task<T>WaitContinueWithBeginEnd

FWIW*AsyncパターンはTask Asynchronous Pattern (TAP) と呼ばれます。非同期プログラミング モデル(APM、Begin/ End) とイベント ベースの非同期パターン(EPM、、、Completedなど)を置き換える、現在推奨されるパターンのようCancelAsyncです。

于 2012-08-21T20:46:22.100 に答える