2014-01-29 2 views
10

Один из моих коллег написал код, который существенно приостанавливается на 1 секунду, прежде чем сделать вызов webservice, чтобы проверить состояние значения. Этот код записывается в действие контроллера приложения MVC 4. Само действие не является асинхронным.Пауза в действии контроллера MVC

var end = DateTime.Now.AddSeconds(25); 
var tLocation = genHelper.GetLocation(tid); 

while (!tLocation.IsFinished && DateTime.Compare(end, DateTime.Now) > 0) 
{ 
    var t = DateTime.Now.AddSeconds(1); 
    while (DateTime.Compare(t, DateTime.Now) > 0) continue; 

    // Make the webservice call so we can update the object which we are checking the status on 
    tLocation = genHelper.GetLocation(tid); 
} 

Кажется, что это работает, но по какой-то причине у меня есть некоторые опасения по поводу его реализации. Есть ли лучший способ сделать эту задержку?

Примечание:

  1. Мы не используем .NET 4.5 и не изменится к этому в этом решении
  2. Javascript варианты сумы как SignalR не вариант в настоящее время

я имел думал, что вопрос был хорошим вариантом, но он не принял его и сказал, что это не требуется, так как то, что он сделал.

How to put a task to sleep (or delay) in C# 4.0?

+0

Я бы переключился на ajax, чтобы запросить веб-сайт, а не блокировать поток на сервере в течение 25 секунд ... – Timmerz

+0

Да, я порекомендую, что спасибо, но время может быть решающим для этого. Cheers – dreza

+0

Возможно, использование .Net 4.5 уже, но я бы все же упомянул, что такое риск и Thread.Sleep. Оба блокируют поток в течение периода времени, в течение которого поток ничего не делает, но не может быть назначен для обслуживания другого запроса. Это приведет к блокировке HTTP-запросов в какой-то момент, потому что потоки не будут доступны. Когда эта точка приходит, зависит от многих факторов, а количество одновременных пользователей - только один из них, например. сайт со многими аякс-запросами на действия пользователя будет работать из потоков с меньшим количеством одновременных пользователей. Поэтому не блокируйте потоки, особенно на веб-сервере. – user3285954

ответ

26

Для MVC и ваша ситуация, этого достаточно:

System.Threading.Thread.Sleep(1000); 

Причудливый способ сделать то же самое, но с большим количеством накладных расходов:

Task.WaitAll(Task.Delay(1000)); 

Обновление:

Быстрая и грязная проверка производительности:

class Program 
{ 
    static void Main() 
    { 
     DateTime now = DateTime.Now; 

     for(int i = 0; i < 10; ++i) 
     { 
      Task.WaitAll(Task.Delay(1000)); 
     } 

     // result: 10012.57xx - 10013.57xx ms 
     Console.WriteLine(DateTime.Now.Subtract(now).TotalMilliseconds); 

     now = DateTime.Now; 

     for(int i = 0; i < 10; ++i) 
     { 
      Thread.Sleep(1000); 
     } 

     // result: *always* 10001.57xx 
     Console.WriteLine(DateTime.Now.Subtract(now).TotalMilliseconds); 

     Console.ReadLine(); 
    } 
} 
+0

Я видел немало комментариев, чтобы сказать, что это было немного, нет, я не использую Thread sleep ?? – dreza

+0

Если вам нужно блокировать сервер, я думаю, что этот вариант - лучший способ пойти ... иначе, как я упомянул в своем другом комментарии, используйте ajax или что-то, чтобы избежать блокировки веб-потоков. – Timmerz

+1

Если вы действительно хотите подождать 1 секунда, это самый простой способ. Единственный реальный вред, который может вызвать поток, который вы используете, будет заблокирован на 1 секунду. Если вы хотите этого избежать, создайте таймер, установите Interval на 1000 и сделайте все, что вам нужно сделать в событии Elapsed, но это, вероятно, не сработает, поскольку я предполагаю, что вам нужно вернуть данные клиенту. – Fayilt

Смежные вопросы