1

我主要是重用旧时代的代码片段:

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

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

                    try
                    {

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

                    }
                }

            });
            renewalThread.Start();
        }

考虑新的 async/await 东西,有没有更优雅的方法来做到这一点?解决方案的主要区别是什么

Task.run( () =>
{
await Task.delay(10000);

update code
}, __.LongRunning);
4

1 回答 1

4

使用 aTimer代替:

    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就是设计的目的,它将采用线程池线程并在调用事件时使用该线程,并且该线程仅在事件期间使用 - 与Sleep. Sleep不准确 - 它可能少于您要求的时间或更多。它在 10 秒内偏离那么多的可能性为零;但这仍然不准确。使用thread.Sleep意味着您不能同时执行两个事件——如果您的Timer事件处理程序花费的时间比间隔时间长,它将一次运行两个处理程序。ATimer更容易停止——你只需调用StopDispose。与Thread.Sleep你必须使用Thread.Abort- 并且有数据损坏的风险(即您必须编写以Thread.Sleep取消线程不会损坏数据的方式调用的代码)。如果您需要在事件中对 UI 线程执行某些操作,请使用Forms.Timer并且您不必处理编组回 UI 线程(例如Control.BeginInvoke)。

我可以继续说下去,但我想你明白了。有关更多详细信息,请参阅http://bit.ly/IhxHSk

于 2013-03-31T21:26:41.850 回答