我该如何在c#>中运行后台线程? 4

时间:2013-03-31 21:19:17

标签: c# async-await

我以前主要是重复使用代码段:

 public void Start()
        {
            renewalThread = new Thread(() =>
            {

                while (!disposed)
                {
                    Thread.Sleep(TimeSpan.FromSeconds(10));

                    try
                    {

                        if (LogUpdated != null)
                            update();
                    }
                    catch (Exception ex)
                    {

                    }
                }

            });
            renewalThread.Start();
        }

有没有更优雅的方法来做到这一点,考虑新的异步/等待的东西? 与

这样的解决方案有什么主要区别
Task.run( () =>
{
await Task.delay(10000);

update code
}, __.LongRunning);

1 个答案:

答案 0 :(得分:4)

改为使用Timer

    aTimer = new System.Timers.Timer(10000);

    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    aTimer.Enabled = true;

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// do something here.
// if this method could take longer than the intervale, disable the
// timer at the start and re-enable at the end.
}

使用Timer,您不必启动新线程。 Thread.Sleep强制您使用坐着等待的线程。如果你想每隔x秒做一次事情,那就是System.Threading.Timer的设计目的,它将需要一个线程池线程并在调用事件时使用它,并且线程将仅在事件期间使用 - 不像SleepSleep不准确 - 可能会少于您要求的时间或更长时间。在10秒钟之内它的可能性是多少是零;但这是不准确的。使用thread.Sleep意味着您不能同时执行两个事件 - 如果您的Timer事件处理程序花费的时间多于间隔,则它将一次运行两个处理程序。 Timer更容易停止 - 您只需拨打StopDispose即可。使用Thread.Sleep,您必须使用Thread.Abort - 并冒险数据损坏(即您必须编写调用Thread.Sleep的代码,以便取消线程不会损坏数据) 。如果您需要在事件中的UI线程上执行某些操作,请使用Forms.Timer,而不必将编组处理回UI线程(例如Control.BeginInvoke)。

我可以继续,但我认为你明白了。有关详细信息,请参阅http://bit.ly/IhxHSk