Приостановка действия контроллера 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();
}
}