我有一些代码执行并获取执行的返回值。 我将此值设置为我的窗口的依赖项属性,因为有绑定到它的样式触发器。 当变量为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用于项目。 谢谢!
答案 0 :(得分:1)
我通常会使用自定义扩展方法:
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线程中编写的:Delayed Dispatch Invoke?
答案 1 :(得分:0)
如果时间准确性不是问题,并且由于您使用的是WPF和.Net 4,这是一个非常简单的问题,只需用以下内容替换您的代码:
new Task(delegate() {
Thread.Sleep(5000);
Dispatcher.Invoke((Action)delegate(){
CompilationStatus = 0;
});
}).Start();
它将通过调度程序在UI线程上调用,因此您应该是安全的。
这个Fire @ Forget方法不是很精确,如果CPU处于压力之下可能会滞后。如果这对你来说不合适,那么你应该使用System.Diagnostics中的Stopwatch类。