当我需要控制各种异步操作需要多长时间时,我一直在使用这种模式。我并不是专门针对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秒,但这对我来说并不重要。
那么,这真的是完成我正在完成的事情的一种坏方法,如果是这样,那么更好的方法是什么?
编辑:也许我应该澄清一下我想要完成的事情。目的是控制等待通话所花费的最长时间。我知道这会破坏异步调用的目的,但意图永远不会异步,我只是用它作为控制何时退出调用的方法。
答案 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。