我对所有这些都不太困惑。我需要在我的应用程序中创建一个生命周期方法,该方法将与asp net Web服务通信,并将返回一些结果。只要我的应用程序正在运行,此方法就永远不会停止。
t=Task.Run(()=>ffAsync());
async void ffAsync()
{
while (true)
{
await Task.Delay(5000);
Console.WriteLine("Reading from server every 5 seconds");
}
}
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触发一次我的事件秒?
答案 0 :(得分:2)
哪种方法对我来说更有效?
这些都不对。它们全都是后台工作者,这对于IO绑定任务是错误的。
您不会雇用工人无所事事,而是每天要睡23小时59分59.9999秒,每天工作0.0001秒。因此,您也不应该雇用线程来这样做。
应该编写异步IO以使用异步,并且应该在需要IO结果的任何上下文中运行。请勿使用Task.Run
。在循环内使用异步IO!
使用
Task.Delay
,Thread.Sleep
还是创建Timer
更好?
请勿雇用工人,然后使他们入睡。使用延迟或设置计时器。选择哪种程序最适合您的程序结构。但是重要的是所有工作流程都应在主线程上完成,并且IO调用必须是异步的。