Я использовал этот шаблон, когда мне нужно контролировать, сколько времени занимают различные асинхронные операции. Я не имею в виду конкретно 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 секунд, но это не важно для меня.
Итак, действительно ли это действительно - плохой способ выполнить то, что я делаю, и если да, то как лучше это сделать?
РЕДАКТИРОВАТЬ: Возможно, я должен уточнить, что я пытаюсь сделать.
Цель состоит в том, чтобы контролировать максимальное количество времени, затрачиваемое на ожидание вызова. Я знаю, что это противоречит цели асинхронного вызова, но намерение никогда не было асинхронным, я просто использую его как средство управления при выходе из вызова.