终生方法的任务,线程与后台工作器

时间:2018-10-23 18:19:04

标签: c# multithreading task backgroundworker

我对所有这些都不太困惑。我需要在我的应用程序中创建一个生命周期方法,该方法将与asp net Web服务通信,并将返回一些结果。只要我的应用程序正在运行,此方法就永远不会停止。

方法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 :(得分:2)

  

哪种方法对我来说更有效?

这些都不对。它们全都是后台工作者,这对于IO绑定任务是错误的。

您不会雇用工人无所事事,而是每天要睡23小时59分59.9999秒,每天工作0.0001秒。因此,您也不应该雇用线程来这样做。

应该编写异步IO以使用异步,并且应该在需要IO结果的任何上下文中运行。请勿使用Task.Run。在循环内使用异步IO!

  

使用Task.DelayThread.Sleep还是创建Timer更好?

请勿雇用工人,然后使他们入睡。使用延迟或设置计时器。选择哪种程序最适合您的程序结构。但是重要的是所有工作流程都应在主线程上完成,并且IO调用必须是异步的