C#(WPF)多线程,涉及控件访问问题
在程序涉及复杂大量计算时,通常需要用另外开个后台线程进行计算,让程序能响应其他的操作,防止出现卡死现象。然而,经常在计算结束后,需要将结果显示到界面的某个控件上,这就需要在新开的线程里访问主线程的UI控件,这会出现不能跨线程访问的问题。下面介绍两种解决方式。
方法1:Dispatcher.Invoke()
public void DoWork()
{
// 在这里面写要让计算机后台进行的代码操作
//计算完后,将结果给TextBox时,采用下面代码
this.TB.Dispatcher.Invoke(new Action(()=>
{
this.TB.text = 计算结果;
}));
}
// 创建一个线程,将要进行后台计算的方法传入
ThreadStart threadStear = new ThreadStart(DoWork);
Thread thd = new Thread(threadStear);
// 开启线程
thd.Start();
方法2:BackgroundWorker()
BackgroundWorker是建立一个后台线程,其中常见的包含2个内容,一个是后台计算内容,另一个是计算结束后要执行的内容,这样就能把大量计算放一个方法里,把计算结束后的对主线程控件的访问放另为一个方法里。
// 定义一个要让后台线程计算的内容的方法,在这个方法里千万不要去访问主线的控件.
private void work_DoWork(object sender, DoWorkEventArgs args)
{
//写大量计算的内容,不要包含对主线线程的控件访问
}
// 定义一个上面的DoWork执行完毕后要执行的内容,可以直接对控件进行访问
private void work_work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{
this.textbox.text = 计算结果;
}
// 声明一个后台线程
BackgroundWorker work = new BackgroundWorker();
// 后台线程要执行的工作添加进线程
work.DoWork += work_DoWork;
// 后台线程工作完,自动要执行的内容添加进去
work.RunWorkerCompleted += work_RunWorkerCompleted;
// 开启线程工作,该方法会自动调用work_DoWork,完成后自动执行work_RunWorkerCompleted
working.RunWorkerAsync();
BackgroundWorker 可以在RunWorkkerCompleted里直接对主线线程里的控件进行访问,并且该方法会在计算的内容完成后自动调用。比较推荐使用方法2。
4347



被折叠的 条评论
为什么被折叠?



