当我需要控制各种异步操作需要多长时间时,我一直在使用这种模式。我并不是专门针对 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 秒,但这对我来说并不重要。
那么,这真的是完成我正在完成的事情的坏方法吗?如果是,有什么更好的方法呢?
编辑:也许我应该澄清我想要完成的事情。
目的是控制等待呼叫所花费的最长时间。我知道这违背了异步调用的目的,但目的绝不是异步的,我只是将它用作控制何时退出调用的一种手段。