асинхронный метод не блокируется на рабочем столе, но блокируется на сервере?

Я сделал простой асинхронный метод для асинхронного вызова хранимой процедуры SQL.

В моей консольной программе я вызываю этот метод 1000 раз в цикле и засыпаю на 1 мс (Thread.Sleep )между каждым вызовом. Я запускаю секундомер перед входом в цикл, останавливаю его при выходе из цикла и отображаю время, проведенное в цикле.

На моей машине разработки (Win7 -VS 2012 RC )я вижу то, что ожидал увидеть:

Completed in 1006 ms

Это кажется логичным,учитывая, что вызов асинхронного метода возвращает почти сразу (при достижении первого awaitключевого слова ), поэтому при выполнении кода перед ожиданием возникают лишь небольшие накладные расходы (6 мс ).

Однако, когда я запускаю точно такой же код на сервере (Win2008 R2 SP1 ), на котором я установил.NET Framework 4.5 RC, код работает нормально, однако время выполнения далеко от того, которое я ожидаю, в нет сравнения с полученным при запуске программы на моей машине для разработки:

Completed in 15520 ms

Это означает, что каким-то образом вызываемый асинхронный метод на самом деле не вызывается асинхронно, и первое ожидание, похоже, каким-то образом блокируется?

Вот код асинхронного метода, который я вызываю:

public async void CallSpAsync()
{
  var cmd = new SqlCommand("sp_mysp");
  {  
     var conn = new SqlConnection(connectionString);
     {
       cmd.Connection = conn;
       cmd.CommandType = CommandType.StoredProcedure;

       [...Filling command parameters here - nothing interesting...]

       await cmd.Connection.OpenAsync();                    
       await cmd.ExecuteNonQueryAsync();

       cmd.Dispose();
       cmd.Connection.Dispose();
     }
  }
}

А вот основной код тестирования программы (цикл):

Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
   CallSpAsync();
   Thread.Sleep(1);
}
sw.Stop();

Я запускаю одну и ту же исполняемую консольную программу (, скомпилированную в выпуске ), на обеих машинах.

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

Есть идеи ?

Спасибо !

РЕДАКТИРОВАТЬ

Проблема не имеет ничего общего с async/await, который работает просто отлично, а из-за того, что разрешение таймера (, используемое StopWatch )на сервере, в 15 раз меньше, чем на моей рабочей станции. Код вовсе не работает медленнее, просто разрешение таймера приводит к неправильному вычислению прошедшего времени.

Смотрите ответ Джеймса Мэннинга ниже.

5
задан darkey 16 July 2012 в 23:08
поделиться