我以前主要是重复使用代码段:
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);
答案 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
的设计目的,它将需要一个线程池线程并在调用事件时使用它,并且线程将仅在事件期间使用 - 不像Sleep
。 Sleep
不准确 - 可能会少于您要求的时间或更长时间。在10秒钟之内它的可能性是多少是零;但这是不准确的。使用thread.Sleep
意味着您不能同时执行两个事件 - 如果您的Timer
事件处理程序花费的时间多于间隔,则它将一次运行两个处理程序。 Timer
更容易停止 - 您只需拨打Stop
或Dispose
即可。使用Thread.Sleep
,您必须使用Thread.Abort
- 并冒险数据损坏(即您必须编写调用Thread.Sleep
的代码,以便取消线程不会损坏数据) 。如果您需要在事件中的UI线程上执行某些操作,请使用Forms.Timer
,而不必将编组处理回UI线程(例如Control.BeginInvoke
)。
我可以继续,但我认为你明白了。有关详细信息,请参阅http://bit.ly/IhxHSk