C#WPF多线程控件访问问题

C#(WPF)多线程,涉及控件访问问题

      • 方法1:Dispatcher.Invoke()
      • 方法2:BackgroundWorker()

在程序涉及复杂大量计算时,通常需要用另外开个后台线程进行计算,让程序能响应其他的操作,防止出现卡死现象。然而,经常在计算结束后,需要将结果显示到界面的某个控件上,这就需要在新开的线程里访问主线程的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。

你可能感兴趣的:(C#)