C# 主线程 辅助线程
来源:互联网 发布:农业科技网络书屋 编辑:程序博客网 时间:2024/05/15 22:22
转自:http://www.cnblogs.com/ghfsusan/archive/2011/02/17/1956974.html
主线程:
就是UI线程;
从主线程通过Thread.Start或AsyncDelegate.BeginEnvoke(可带参数、定义回调方法、避免轮询)将进入辅助线程;采用异步的方式调用委托可以在界面重绘时避免工作线程被阻塞;
从主线程中调用委托的AsyncDelegate.EndEnvoke方法将进入辅助线程(EndInvoke()是阻塞方法,在回调方法中调用EndInvoke可以获得异步调用的方法的返回值),并等待结束。
辅助线程:
就是工作线程;
从辅助线程通过调用任何控件的Controls.Invoke方法或Controls.BeginInvoke可以切换回到主线程;并将Invoke/BeginInvoke()中的那个object数组类型的参数传递给委托参数供委托作为参数执行。
切记:AsyncDelegate.BeginEnvoke参数中的回调方法是在辅助线程中执行的,而不是在主线程中。这意味着你永远不要企图在类似的回调方法中去实现UI的更新!(这意味着回调方法同步调用的方法也在辅助线程中执行)
控件的Invoke和BeginInvoke 方法所调用的委托无论如何都是在 UI 线程中执行的
委托回调里调用EndInvoke是阻止主线程运行的.也就是说主线程要等BeginInvoke的线程执行完才执行.
而回调方法的线程和委托方法的线程在一个线程上
在新线程中运行程序的三种方法(下面例子中,Compute是封装耗时运算的类,通常Compute.GenXLRZ是个长时间任务需要在辅助线程中执行,GenXLRZ中通过调用OnUpdate引发事件Update;):
Compute c = new Compute();
c.Update += new Compute.UpdateEventHandler(c_Update);//c.Update 向主线程发送事件通知,通常用于更新界面
//方法1直接用ThreadStart
//Thread t = new Thread(new ThreadStart(c.GenXLRZ));
//t.Start();
//方法2比较灵活,可以有回调方法
//GenXLRZDelegate genXLRZ=new GenXLRZDelegate(c.GenXLRZ);
//genXLRZ.BeginInvoke(new System.AsyncCallback(this.EnableControl), null);//通过委托异步调用,回调EnableControl也是在新线程中运行
//方法3用 ThreadPool,比较简单
WaitCallback async = new WaitCallback(c.GenXLRZ);
ThreadPool.QueueUserWorkItem(async, null);
再次强调:BeginInvoke的回调方法this.EnableControl、辅助线程中执行的c.GenXLRZ方法中引发事件的响应方法c_Update都是运行在辅助线程上的,也就是不能直接访问UI控件(通过Control.Invoke的方式访问-这个方法总是切换到主线程上执行委托方法)
- C# 主线程 辅助线程
- C# 主线程 辅助线程
- C# 主线程 辅助线程
- 主线程、辅助线程、线程切换
- C# 线程调用主线程中的控件
- c++builder中辅助线程访问主线程的控件的方法
- C# 子线程使用主线程中的控件问题
- C#中让副线程跟主线程交互的类-BackgroundWorker
- C# 在工作线程中调用主线程中的方法
- C#中worker线程与UI主线程通信
- c#子线程执行完怎么通知主线程
- c#中后台线程更新主线程ui的方法
- C# 子线程调用主线程窗体的解决方法
- c#子线程执行完怎么通知主线程
- C# SynchronizationContext (子线程修改UI主线程简单例子)
- c# 子线程锁中调用主线程死锁
- c#子线程执行完怎么通知主线程
- C#子线程执行完后通知主线程
- 在 console mode 中使用 C/C++ 編譯器
- ACProtect unpack record2
- c# 不可见的字符,删除?
- 正则表达式(1)
- 使用BackgroundWorker组件进行异步操作编程
- C# 主线程 辅助线程
- Apple: Mac OS X美洲狮10.8的硬件兼容列表
- Linux 下搭建SVN 之安装
- linux2.6.12 下s3c2440 camera接口 源码分析和个人思考之 read方法篇
- 回调函数原理以及自定义回调函数
- 感染导入表方法-附源码(转载)
- WinDbg 下断点命令详解
- Linux 下搭建SVN 之部署
- 利用PDB文件获取未导出全局变量、函数等信息