当我需要控制各种异步操作需要多长时间时,我一直在使用这种模式.我并不是专门针对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秒,但这对我来说并不重要.
那么,这是否真的是一种完成我正在完成的事情的坏方法,如果是这样,那么更好的方法是什么呢?
编辑:也许我应该澄清我想要完成的事情.
目的是控制等待呼叫所花费的最长时间.我知道这会破坏异步调用的目的,但意图永远不是异步的,我只是用它来控制退出调用的方法.
WaitHandles等待方法支持超时,使用它.就像是:
var asyncResult = request.BeginGetResponse(... asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10))