0

さまざまな非同期操作にかかる時間を制御する必要があるときに、このパターンを使用してきました。特に WebRequest を意味するわけではありません (タイムアウト プロパティを設定できることはわかっています)。パターンの例としてこれを使用しました。

        var request = WebRequest.Create(someUri);

        WebResponse response = null;
        request.BeginGetResponse(result =>
            {
                var asyncRequest = (WebRequest)result.AsyncState;
                response = asyncRequest.EndGetResponse(result);
            }, request);

        DateTime timeout = DateTime.Now.AddSeconds(10);
        while (response == null && DateTime.Now <= timeout)
        {
            Thread.Sleep(0);
        }
        if (response == null) throw new Exception("Timeout!");

Thread.Sleep() について読んだところならどこでも、それはひどいことだと聞きましたが、この使用例がそれを悪用しているとは本当に思いません。

正確に 10 秒を少し超える可能性があることはわかっていますが、それは私にとって重要ではありません。

それで、これは私が達成していることを達成するための本当に悪い方法ですか? もしそうなら、それを行うためのより良い方法は何ですか?

編集: おそらく、私が達成しようとしていることを明確にする必要があります。

目的は、通話の待機に費やされる最大時間を制御することです。これが非同期呼び出しの目的に反することは承知していますが、意図は決して非同期にすることではなく、呼び出しを終了するときに制御する手段として使用しているだけです。

4

3 に答える 3

6

WaitHandles の待機メソッドはタイムアウトをサポートしています。それを使用してください。何かのようなもの:

  var asyncResult = request.BeginGetResponse(...
  asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10))
于 2009-01-30T08:04:19.963 に答える
0

完全を期すために: 現在のスレッドをブロックしないようにするには、System.Threading.Timer を使用します。

于 2009-01-30T08:09:11.750 に答える