任务 vs 线程 vs 后台工作者的终生方法

Dim*_*Dim 1 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");
    }
 }
Run Code Online (Sandbox Code Playgroud)

Method2 使用后台工作者

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();
}
Run Code Online (Sandbox Code Playgroud)

方法 3 使用线程

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

在我的情况下哪种方法更有效?还有另一个优化问题,最好使用 task.delay(x),Thread.Sleep(x) 每 x 秒运行一次我的循环,还是创建一个计时器(如我的秒示例),它会每 x 触发一次我的事件秒?

Eri*_*ert 5

在我的情况下哪种方法更有效?

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

你不会雇佣一个工人什么都不做,只能每天睡 23 小时 59 分 59.9999 秒,做 0.0001 秒的工作。因此,您也不应该雇用线程来执行此操作。

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

是它更好地使用Task.DelayThread.Sleep或创建一个Timer

不要雇佣工人然后让他们睡觉。要么使用延迟,要么制作计时器。选择哪个更适合您的程序结构。但重要的是所有的工作流都应该在主线程上完成,并且 IO 调用必须是异步的

  • @joe:我不知道如何回答你的问题。这对我来说很难,这是肯定的。我非常擅长为编程语言构建语义分析器,但对异步 IO 的实现细节几乎一无所知。这就是为什么我把这项工作留给了这方面的专家。 (2认同)