【发布时间】:2018-10-23 18:19:04
【问题描述】:
我对这一切有点困惑。我需要在我的应用程序中创建一个生命周期方法,它将与 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");
}
}
使用后台工作者的方法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中需要tokenSource吗?我不认为你这样做。如果这个线程会一直运行到你的应用程序死掉,那么你就不需要它了。或者我在这里错过了什么?如果我理解正确,当所有前台线程都完成后,应用程序将关闭,并且它会破坏所有后台线程。下一个问题:你需要这个方法的结果吗?如果你这样做了,那么你应该使用Task,如果你不这样做,那么你应该使用Thread。
-
在某些情况下,我会在 ui 线程中从我的方法返回一些结果。例如,如果服务器有一些结果,我将打开一个新表单来通知客户端这是关于什么的。在我的应用程序中,它会给我带来更好的性能和速度吗?
-
另外哪种方法更受欢迎?使用时间或任务延迟?
-
永远保持线程,主要是在睡觉,这通常不是一个明智的主意。 1和2没有本质区别,Task.Delay也用了Timer,只是看不到而已。除了一个令人讨厌的小细节,如果你实际做的事情超过 5 秒,那么 BackgroundWorker 会提醒你这件事,但有一个例外。该任务只需要超过 5 秒,现在已经完成了。
标签: c# multithreading task backgroundworker