Dim*_*Dim 1 c# multithreading task backgroundworker
我对这一切都有些困惑。我需要在我的应用程序中创建一个生命周期方法,它将与 asp net web 服务进行通信,并返回一些结果。只要我的应用程序在运行,这个方法就永远不会停止。
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)
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 触发一次我的事件秒?
在我的情况下哪种方法更有效?
这些都不对。他们都做后台工作者,这对于 IO 绑定任务是错误的。
你不会雇佣一个工人什么都不做,只能每天睡 23 小时 59 分 59.9999 秒,做 0.0001 秒的工作。因此,您也不应该雇用线程来执行此操作。
异步 IO 应该被编写为使用异步,并且应该在需要 IO 结果的任何上下文上运行。不要使用Task.Run. 在循环内使用异步 IO!
是它更好地使用
Task.Delay,Thread.Sleep或创建一个Timer?
不要雇佣工人然后让他们睡觉。要么使用延迟,要么制作计时器。选择哪个更适合您的程序结构。但重要的是所有的工作流都应该在主线程上完成,并且 IO 调用必须是异步的。