
当程序涉及大量复杂的计算时,通常需要打开另一个后台线程进行计算,以便程序可以响应其他操作并防止卡住现象. 但是,通常需要在计算完成后将结果显示在界面上的控件上. 这需要访问新打开的线程中主线程的UI控件. 这将导致跨线程访问的问题. 下面介绍两种解决方案.

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();

BackgroundWorker是创建一个后台线程,通常包含2个内容c#对windows 窗体控件进行线程安全调用,一个是后台计算内容,另一个是计算完成后要执行的内容,因此可以将大量计算合并为一个方法c#对windows 窗体控件进行线程安全调用,计算完成后,将对主线程控件的访问权放在另一种方法中.
// 定义一个要让后台线程计算的内容的方法,在这个方法里千万不要去访问主线的控件.
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.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-244250-1.html
去不了
处于中国领海和国际公共海域交界海域