任务 vs 线程 vs 后台工作线程的生命周期方法



我对这一切有点困惑。我需要在我的应用程序中创建一个终身方法,它将与 asp 网络 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 秒触发一次我的事件?

哪种方法对我更有效?

这些都不对。它们都使后台工作线程,这对于 IO 绑定任务来说是错误的。

你不会雇佣一个工人什么都不做,只是每天睡 23 小时 59 分钟 59.9999 秒,做 0.0001 秒的工作。 所以你也不应该雇佣一个线程来做这件事。

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

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

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

最新更新