gpt4 book ai didi

c# - 终身方法的任务 vs 线程 vs 后台 worker

转载 作者:行者123 更新时间:2023-12-03 13:16:56 25 4
gpt4 key购买 nike

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

Method-1 创建任务。

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

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

Method2 使用后台 worker
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();
}

Method-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 触发一次我的事件秒?

最佳答案

Which method is more effective in my case?



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

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

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

is it better to use a Task.Delay, Thread.Sleep or creating a Timer?



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

关于c# - 终身方法的任务 vs 线程 vs 后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52955466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com