0

当我需要控制各种异步操作需要多长时间时,我一直在使用这种模式。我并不是专门针对 WebRequest(我知道您可以设置 timeout 属性),我只是将此作为模式的示例。

        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 回答
1

我的代码看起来也很好。timeout如果 api 中没有属性,这只是一种支持同步调用属性的方法。虽然我应该说你最好用某种类替换这个等待循环WaitHandle,但它会使用更少的资源,而且我相信它看起来会更好。抱歉,由于我不了解 C# 并且它的 API 很好,因此无法提供解决方案。

于 2009-01-30T08:15:42.297 回答
0

为了完整性:为避免阻塞当前线程,请使用 System.Threading.Timer。

于 2009-01-30T08:09:11.750 回答