Насколько плох этот шаблон? - PullRequest
0 голосов
/ 30 января 2009

Я использовал этот шаблон, когда мне нужно контролировать, сколько времени занимают различные асинхронные операции. Я не имею в виду конкретно 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 секунд, но это не важно для меня.

Итак, действительно ли это действительно - плохой способ выполнить то, что я делаю, и если да, то как лучше это сделать?

РЕДАКТИРОВАТЬ: Возможно, я должен уточнить, что я пытаюсь сделать.

Цель состоит в том, чтобы контролировать максимальное количество времени, затрачиваемое на ожидание вызова. Я знаю, что это противоречит цели асинхронного вызова, но намерение никогда не было асинхронным, я просто использую его как средство управления при выходе из вызова.

Ответы [ 3 ]

6 голосов
/ 30 января 2009

Методы ожидания WaitHandles поддерживают тайм-аут, используйте это. Что-то вроде:

  var asyncResult = request.BeginGetResponse(...
  asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(10))
1 голос
/ 30 января 2009

Код тоже отлично смотрится. Это просто способ поддержки свойства timeout при вызове синхронизации, если в API его нет. Хотя я должен сказать, что вам лучше заменить этот цикл ожидания на какой-то класс WaitHandle, он будет использовать меньше ресурсов, и я уверен, что он будет выглядеть лучше. Извините, не могу предоставить решение, так как я не знаю C #, и это хорошо API.

0 голосов
/ 30 января 2009

Для полноты: чтобы избежать блокировки текущего потока, используйте System.Threading.Timer.

...