开发者

Reset value of a variable after a delay in WPF

I have some code that executes and gets the return value of execution. I set this value to a dependency property of my window because t开发者_StackOverflow社区here are style triggers bound to it. When the variable is 0 it uses the default style, when 1 a reddish style, and when 2 a greenish.

But i have to reset this style after a while in some practical way.

What is the easiest method to do this?

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 and .Net 4 is used in project. Thanks!!


I usually use a custom extension method for this:

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();
    }
}

In your case you can then use it like this:

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

Edit: I had forgotten, but looks like this method originally was written by Jon Skeet in this SO thread: Delayed Dispatch Invoke?


If time exactness is not an issue, and since you are using WPF and .Net 4 this is a very easy one, just replace you code with the following:

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

It will invoke on the UI thread through the dispatcher, so you should be safe.

This Fire@Forget method is not very exact and could lag if the CPU is under stress. If that is a no-go for you then you should use the Stopwatch class in System.Diagnostics.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜