Задача против потока против фонового рабочего для пожизненного метода - PullRequest
0 голосов
/ 23 октября 2018

Я немного запутался со всем этим.Мне нужно создать пожизненный метод внутри моего приложения, который будет связываться с веб-сервисом asp net, и он вернет мне некоторые результаты.Пока мое приложение работает, этот метод никогда не остановится.

Метод-1, создающий задачу.

 t=Task.Run(()=>ffAsync());

 async void ffAsync()
 {
    while (true)
    {
      await Task.Delay(5000);
      Console.WriteLine("Reading from server every 5 seconds");
    }
 }

Метод2 с использованием фонового рабочего

Timer t = new Timer();   
t.Interval = 5000;    
timer1.Enabled = true;  
timer1.Tick += new 
System.EventHandler(OnTimerEvent);

private void OnTimerEvent(object sender, EventArgs e) 
{
 backgroundWorker1.RunWorkerAsync();
}

Метод-3 Использование темы

new Thread(() =>
{
   Thread.CurrentThread.IsBackground = true;
   while(true)
   {
      Thread.Sleep(5000);
      Console.WriteLine("Run every 5 seconds");
   }
 }).Start();

Какой метод более эффективен в моем случае?Также еще один вопрос оптимизации, лучше ли использовать task.delay (x), Thread.Sleep (x) для запуска моего цикла каждые x секунд или создания таймера (как мой пример секунд), который будет запускать мое событие каждые xсекунд?

1 Ответ

0 голосов
/ 24 октября 2018

Какой метод более эффективен в моем случае?

Ни один из них не является правильным.Все они работают в фоновом режиме, что неправильно для задач, связанных с вводом-выводом.

Вы не нанимаете работника, который делает только сон 23 часа 59 минут и 59,9999 секунды в день и выполняет 0,0001 секунды работы.Поэтому вам не следует нанимать поток для этого.

Асинхронный ввод-вывод должен быть написан для использования асинхронности и должен выполняться в любом контексте, в котором требуется результат ввода-вывода.Не используйте Task.Run.Используйте асинхронный ввод-вывод внутри цикла!

лучше ли использовать Task.Delay, Thread.Sleep или создать Timer?

Не нанимать работникаа затем заставьте их спать.Либо используйте задержку, либо сделайте таймер.Выберите, какой из них лучше работает для структуры вашей программы.Но важно то, что весь рабочий процесс должен выполняться в основном потоке, а вызовы ввода-вывода должны быть асинхронными .

...