b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

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

电脑杂谈  发布时间:2020-06-13 21:04:41  来源:网络整理

c#windows窗体应用程序开发技术_c# 线程调用一个控件_c#对windows 窗体控件进行线程安全调用

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

c#windows窗体应用程序开发技术_c# 线程调用一个控件_c#对windows 窗体控件进行线程安全调用

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

c#windows窗体应用程序开发技术_c# 线程调用一个控件_c#对windows 窗体控件进行线程安全调用

BackgroundWorker是创建一个后台线程,通常包含2个内容c#对windows 窗体控件进行线程安全调用,一个是后台计算内容,另一个是计算完成后要执行的内容,因此可以将大量计算合并为一个方法c#对windows 窗体控件进行线程安全调用,计算完成后,将对主线程控件的访问权放在另一种方法中.

c#windows窗体应用程序开发技术_c# 线程调用一个控件_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();

c#对windows 窗体控件进行线程安全调用_c# 线程调用一个控件_c#windows窗体应用程序开发技术

BackgroundWorker可以直接在RunWorkkerCompleted中访问主线程中的控件,并且在完成计算内容之后将自动调用此方法. 更多推荐的方法2.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-244250-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 杨静
        杨静

        处于中国领海和国际公共海域交界海域

      • 覃露露
        覃露露

        去不了

      热点图片
      拼命载入中...