由于编写的WPF程序中,在程序启动时需要对用户控件进行刷新一次,就写在了Window_Loaded函数中,但是发现对界面改变并没有什么效果,于是开始debug……
public MainWindow()
{
InitializeComponent();
//......
Console.WriteLine("MainWindow end");
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
UpdatePipeline();
Dispatcher.Invoke(new Action(() =>
{
UpdatePipeline();
}));
new Thread(new ThreadStart(() =>
{
Dispatcher.Invoke(new Action(() =>
{
UpdatePipeline();
}));
})).Start();//创建一个线程1000ms后运行一次UpdatePipeline
Console.WriteLine("Window_Loaded end");
}
private void Window_Initialized(object sender, EventArgs e)
{
Console.WriteLine("Window_Initialized end");
}
private void UpdatePipeline()
{
//......
Console.WriteLine("UpdatePipeline()");
}
调试输出结果顺序如下(删除了部分系统输出):
Window_Initialized end
MainWindow end
......
UpdatePipeline()
UpdatePipeline()
Window_Loaded end
“Effluent.exe”(CLR v4.0.30319: Effluent.exe): 已加载“Microsoft.GeneratedCode”。
UpdatePipeline()
线程 0xa4 已退出,返回值为 0 (0x0)。
可以看到,其执行顺序是Window_Initialized
->MainWindow
->Window_Loaded
而在Window_Loaded
中调用了三次UpdatePipeline
函数,虽然三次都成功的改写了空间中的属性值(颜色),但是前两次调用(直接调用,委托调用)并没有改变显示效果,只有第三次通过创建线程的方式,才成功修改了实际显示效果。