代码之家  ›  专栏  ›  技术社区  ›  Daniel Schaffer

这种模式有多坏?

  •  0
  • Daniel Schaffer  · 技术社区  · 16 年前

    当我需要控制各种异步操作需要多长时间时,我一直在使用这个模式。我不是说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()的任何地方,我都听说这是baaad的事情,但我并不认为这个用例会滥用它。

    我知道这可能比10秒多一点,但这对我来说并不重要。

    所以,这是 真正地 完成我正在完成的任务是一个糟糕的方法,如果是这样的话,还有什么更好的方法呢?

    编辑:也许我应该澄清一下我想完成什么。

    目的是控制等待呼叫的最大时间。我知道这样做会破坏异步调用的目的,但目的绝不是异步的,我只是用它作为退出调用时控制的手段。

    3 回复  |  直到 16 年前
        1
  •  6
  •   Patrik Hägne    16 年前

    waithandles等待方法支持超时,请使用它。类似:

      var asyncResult = request.BeginGetResponse(...
      asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10))
    
        2
  •  1
  •   vava    16 年前

    代码看起来也很好。这只是一种支持 timeout 如果API中没有,则调用同步属性。尽管我应该说你最好用某种 WaitHandle 类,它将使用较少的资源,我肯定会看起来更好。抱歉,因为我不太了解C和它的API,所以无法提供解决方案。

        3
  •  0
  •   Simon Buchan    16 年前

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