C# WPF中延迟后的变量重置值

C# WPF中延迟后的变量重置值,c#,.net,wpf,C#,.net,Wpf,我有一些代码可以执行并获取执行的返回值。 我将此值设置为窗口的依赖项属性,因为有样式触发器绑定到它。 当变量为0时,它使用默认样式;当变量为1时,它使用红色样式;当变量为2时,它使用绿色样式 但过了一段时间,我不得不以某种实际的方式重新设置这种风格 最简单的方法是什么 if (!Compiler.TryCompile(strText, Models[Model], EntryPoint.Text, out error)) { output.Items.Add("Error compili

我有一些代码可以执行并获取执行的返回值。 我将此值设置为窗口的依赖项属性,因为有样式触发器绑定到它。 当变量为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和.NET4。
谢谢

如果时间精确性不是一个问题,而且由于您使用的是WPF和.Net 4,因此这是一个非常简单的问题,只需将代码替换为以下内容:

new Task(delegate() {
  Thread.Sleep(5000);
  Dispatcher.Invoke((Action)delegate(){
     CompilationStatus = 0;
  });
}).Start();
它将通过dispatcher在UI线程上调用,因此您应该是安全的


这个Fire@Forget方法不是很精确,如果CPU受到压力,可能会滞后。如果您不能这样做,那么您应该在System.Diagnostics中使用Stopwatch类。

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

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线程中编写的: