Приостановка действия контроллера MVC

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

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);
}

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

Примечание:

  • Мы не используем .NET 4.5 и не будем изменять это в этом решении
  • Параметры сценария Javascript, такие как SignalR, в настоящее время не являются параметрами

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

Как поставить задачу в режим ожидания (или задержки) на С# 4.0?

Ответ 1

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

System.Threading.Thread.Sleep( 1000 );

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

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

Update:

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

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();
    }
}