这种模式有多糟糕?

时间:2009-01-30 07:44:56

标签: c# design-patterns asynchronous

当我需要控制各种异步操作需要多长时间时,我一直在使用这种模式。我并不是专门针对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秒,但这对我来说并不重要。

那么,这真的是完成我正在完成的事情的一种坏方法,如果是这样,那么更好的方法是什么?

编辑:也许我应该澄清一下我想要完成的事情。

目的是控制等待通话所花费的最长时间。我知道这会破坏异步调用的目的,但意图永远不会异步,我只是用它作为控制何时退出调用的方法。

3 个答案:

答案 0 :(得分:6)

WaitHandles等待方法支持超时,使用它。类似的东西:

  var asyncResult = request.BeginGetResponse(...
  asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10))

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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