Asynch任务内部计时器

时间:2016-05-03 19:51:36

标签: c# multithreading timer sleep

我想在窗口服务应用程序中替换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);
    }
}

2 个答案:

答案 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