Как спать или блокировать выполнение в asyn c методе. Thread.Sleep не работает - PullRequest
0 голосов
/ 16 марта 2020

У меня есть метод asyn c, который имеет сигнатуру:

public static async void Run(..)
{
  //..
  var responseMessage = await client.PostAsync(..);
  // ..
   using (Stream stream = await responseMessage.Content.ReadAsStreamAsync())
   //...

   Thread.Sleep(5000);
}

Я могу использовать этот метод внутри моего консольного приложения следующим образом:

 static async Task Main(string[] args)
 {
     for(int x = 1; x < 100; x++)
     {
        Run(...);
     }  
 }

Я хочу block / sleep внутри моего метода Run из-за ограничения скорости, как я могу это сделать?

Я пробовал это:

 public static async void Run(...)
    {
      // ...
       Thread.Sleep(5000);
    }

Но, похоже, это ничего не дало. Может кто-нибудь объяснить, почему это не сработало и правильно?

1 Ответ

5 голосов
/ 16 марта 2020

Вам необходимо использовать Task.Delay при использовании шаблона async:

static async Task Main(string[] args)
{
   for(int x = 1; x < 100; x++)
   {
      await Run(...);
   }  
}

public static async Task Run(...)
{
  // ...
  await Task.Delay(5000);
}

ПРИМЕЧАНИЕ. Я также изменил ваш метод Run на async так что это можно ожидать. Кроме того, async void, как правило, плохая идея, и обычно ее следует делать только при написании обработчиков событий.

...