我想在窗口服务应用程序中替换Thread.sleep()。但我没有得到如何在我的代码中使用它。在我的服务中,我必须在每10分钟后在foreach循环中迭代一个机器列表,并且在该循环中,我在一段时间延迟之后启动了新线程,例如2秒延迟。所以我在每个线程创建后都使用thread.sleep()。我该怎么做才能替换Thread.sleep()我必须在计时器中使用异步任务,但我没有得到如何在异步任务中转换它。
protected override void OnStart(string[] args)
{
timer1 = new System.Timers.Timer();
this.timer1.Interval = 10000;
this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Tick);
timer1.Enabled = true;
}
private void timer2_Tick(object sender, EventArgs e)
{
foreach( var list in machinelist)
{
createComAndMessagePumpThread2 = new Thread(() =>
{
// connection with machines code using list
Application.Run();
});
createComAndMessagePumpThread2.SetApartmentState(ApartmentState.STA);
createComAndMessagePumpThread2.Start();
Thread.Sleep(2000);
}
}
答案 0 :(得分:0)
如果你想要的只是将Thread.Sleep()
转换为等效的异步方法,这将完成工作:
protected override void OnStart(string[] args)
{
Task.Run(async ()=> { while(true) await LunchTasks(); });
}
private Task LunchTasks()
{
var tasks = machinelist.Select(machinelist=>
foreach( var machinelist in machinelist)
{
createComAndMessagePumpThread2 = new Thread(() =>
{
// connection with machines code using list
Application.Run();
});
createComAndMessagePumpThread2.SetApartmentState(ApartmentState.STA);
createComAndMessagePumpThread2.Start();
return Task.Delay(2000);
}
}
但你几乎无法从中受益。定期为每个“应用程序”旋转新线程比在Thread.Sleep()
上阻止的一个线程要昂贵得多。如果要使用异步编程的全部功能,则必须弄清楚如何将应用程序与物理线程分离。你需要习惯Task
而不是Thread
的概念。希望你的程序能够做到这一点。
答案 1 :(得分:-2)
是否确实需要延迟,因为操作系统可能会在应用程序启动时为您管理资源?为什么不做这样的事呢?
protected override void OnStart(string[] args)
{
Parallel.ForEach(
machinelist, (list) =>
{
var Application = //however you do this...
Application.Run();
}
);
}
...如果需要,请使用different TaskScheduler。