WPF&MVVM线程问题
别让能力撑不起野心
后台,UI线程
专业解释我就不贴,说说自己的个人愚见,线程有后台,UI(前台)之分,UI元素所使用的线程为UI线程,其他的可以理解为后台线程。
区别:程序要关闭,必须等待UI线程终止,而不用等待后台线程终止。(这个也是为什么有时候我们的界面会卡死,但也关闭不了的原因)
举个例子:
界面上做个按钮ProgressBar,和Button,按钮click设置点击事件:
private void Button_Click(object sender, RoutedEventArgs e)
{
for(int j = 0; j < 100; j++)
{
this.progressbar.Value = j;
System.Threading.Thread.Sleep(100);
}
}
按钮点击后,我们会发现窗口卡住了,今天我们就是要处理这样的问题。
一般线程交互
有了上面抛的砖,下面我们继续捡砖(常规WPF的线程交互)。
先说说所使用的技术:
1.Dispatcher(UI),线程调度器;
2.Task.Factory,(线程工厂,底层是线程池);
a.首次修改(引入Dispatcher)
直接上代码了
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int j = 0; j < 100; j++)
{
this.progressbar.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, (Action)delegate () {
this.progressbar.Value = j;
});
System.Threading.Thread.Sleep(