在WPF中延迟后重置变量的值

我有一些代码执行并获取执行的返回值。 我将此值设置为我的窗口的依赖项属性,因为有绑定到它的样式触发器。 当变量为0时,它使用默认样式,1表示偏红样式,2表示绿色。

但是我必须在一段时间后以某种实际的方式重置这种风格。

最简单的方法是什么?

if (!Compiler.TryCompile(strText, Models[Model], EntryPoint.Text, out error)) { output.Items.Add("Error compiling:"); output.Items.Add(error); CompilationStatus = 1; // dependency property bound on ui } else { output.Items.Add("Compilation successful!"); CompilationStatus = 2; // dependency property bound on ui } // should execute this after 5 seconds CompilationStatus = 0; // dependency property bound on ui 

WPF和.Net 4用于项目中。 谢谢!!

我通常使用自定义扩展方法:

 public static class DispatcherHelper { public static void DelayInvoke(this Dispatcher dispatcher, TimeSpan ts, Action action) { DispatcherTimer delayTimer = new DispatcherTimer(DispatcherPriority.Send, dispatcher); delayTimer.Interval = ts; delayTimer.Tick += (s, e) => { delayTimer.Stop(); action(); }; delayTimer.Start(); } } 

在您的情况下,您可以像这样使用它:

 Dispatcher.DelayInvoke(TimeSpan.FromSeconds(5), () => { CompilationStatus = 0; } 

编辑:我忘记了,但看起来这个方法最初是由Jon Skeet在这个SO线程中写的: 延迟调度调用?

如果时间准确性不是问题,并且由于您使用的是WPF和.Net 4,这是一个非常简单的问题,只需用以下代码替换您的代码:

 new Task(delegate() { Thread.Sleep(5000); Dispatcher.Invoke((Action)delegate(){ CompilationStatus = 0; }); }).Start(); 

它将通过调度程序在UI线程上调用,因此您应该是安全的。

这个Fire @ Forget方法不是很精确,如果CPU处于压力之下可能会滞后。 如果这对你不合适,那么你应该使用System.Diagnostics中的Stopwatch类。