




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念.我理解的委托就是 具有 同样参数和返回值 的函数的集合.比如public delegate void MyDelegate(int arg);就是这种形式的函数 void Myfuntion(int i); 的集合.如何将一个函数加入 委托 的集合?MyDelegate dele = new MyDelegate(Myfuntion1);再增加一个dele += new MyDelegate(Myfuntion2);.委托函数 dele 就是 具有整数参数和空返回值的函数 Myfuntion1,2的集合.调用这个委托函数dele(1);就是逐个调用 Myfuntion1,2,.一般线程函数的声明和启动Thread t = new Thread(new ThreadStart(MyFunction);t.Start();正是调用了没有参数和返回值的 委托函数 ThreadStart其中的参数MyFunction 是 这个委托函数中的一员.很明显 这样无法传参数和返回值,那我们该怎么办?答案就在委托 的BeginInvoke() 方法上, BeginInvoke() 也是(异步)启动一个新线程.例如MyDelegate dele = new MyDelegate (MyFunction);dele.BeginInvoke(10,abcd);void MyFunction(int count, string str);可以实现参数的传递.如何收集线程函数 的 返回值?与 BeginInvoke 对应 有个 EndInvoke 方法,而且运行完毕返回 IAsyncResult 类型的返回值.这样我们可以这样收集 线程函数的 返回值MyDelegate dele = new MyDelegate (MyFunction);IAsyncResult ref = dele.BeginInvoke(10,abcd);.int result = dele.EndInvoke(ref); -收集 返回值int MyFunction(int count, string str); -带参数和返回值的 线程函数提示:线程间操作无效:从不是创建控件“XX”的线程访问它一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。 现在用一个用线程控制的进程条来说明,大致的步骤如下:1 创建Invoke函数,大致如下: / / Delegate function to be invoked by main thread /private void InvokeFun() if( prgBar.Value 100 )prgBar.Value = prgBar.Value + 1; 2 子线程入口函数: / / Thread function interface /private void ThreadFun() /Create invoke method by specific functionMethodInvoker mi = new MethodInvoker( this.InvokeFun );for( int i = 0; i 100; i+ ) this.BeginInvoke( mi ); Thread.Sleep( 100 ); 3 创建子线程:Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );thdProcess.Start();出现这个问题主要是因为在线程方法中操作了界面上的控件.lstPrime.Items.Add() 可以这样改下. /定义一个委托 public delegate void MyInvoke(string str); /定义一个操作界面的方法 private void UpdateUI(string str) /增加项 this.lstPrime.Items.Add(str); /在线程的方法中,即你的Generate方法. /里面只要是涉及到Items.Add操作的都改成如下形式即可. /比如lstPrime.Items.Add(2);改成: MyInvoke mi=new MyInvoke(UpdateUI); this.BeginInvoke(mi,new object 2 ); =BeginInvoke与Invoke的含义转载BeginInvoke 方法真的是新开一个线程进行异步调用吗? 参考以下代码: public delegate void treeinvoke(); private void UpdateTreeView() MessageBox.Show(System.Threading.Thread.CurrentThread.Name); private void button1_Click(object sender, System.EventArgs e) System.Threading.Thread.CurrentThread.Name = UIThread; treeView1.BeginInvoke(new treeinvoke(UpdateTreeView); 看看运行结果,弹出的对话框中显示的是 UIThread,这说明 BeginInvoke 所调用的委托根本就是在 UI 线程中执行的。 既然是在 UI 线程中执行,又何来“异步执行”一说呢? 我们再看看下面的代码: public delegate void treeinvoke(); private void UpdateTreeView() MessageBox.Show(Thread.CurrentThread.Name); private void button1_Click(object sender, System.EventArgs e) Thread.CurrentThread.Name = UIThread; Thread th = new Thread(new ThreadStart(StartThread); th.Start(); private void StartThread() Thread.CurrentThread.Name = Work Thread; treeView1.BeginInvoke(new treeinvoke(UpdateTreeView); 再看看运行结果,弹出的对话框中显示的还是 UIThread,这说明什么?这说明 BeginInvoke 方法所调用的委托无论如何都是在 UI 线程中执行的。 那 BeginInvoke 究竟有什么用呢? 在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,具体的原因可以在看完我的这篇之后看看这篇:在多线程中如何调用Winform,如果你是大牛的话就不要看我这篇了,直接看那篇吧,反正那篇文章我没怎么看懂。 Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。 正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。 而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而以,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。 而在那段更新树节点的代码中,其实唯一起作用的代码是:System.Threading.Thread.Sleep(100);,它使 UI 线程有了处理界面消息的机会,其实 数码幽灵 将问题复杂化了,只要以下的代码就可以很好的工作了。 private void button1_Click_(object sender, System.EventA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度重点工程土石方工程居间服务费标准范本
- 2025版滕彩离婚协议书附离婚协议签订及履行监督服务
- 2025版涉外法律事务处理及咨询合同下载
- 2025版全国离婚协议书审查与鉴定合同
- 2025版土地拍卖后续服务合同示范文本
- 2025版老旧小区改造工程外包施工合同范本
- 2025年切削钻机租赁及智能化改造服务合同
- 2025年度关键岗位保密及禁止同行业竞争协议
- 2025年度电工电气设备租赁与维护服务合同
- 2025版在线医疗健康服务平台采购与推广合同
- 膝痹中医护理方案效果总结分析报告
- 铸造基础知识及常见铸造缺陷简介演示
- 中式烹调师(高级技师考试资料)
- 仓储技术与库存理论简论
- 日地空间灾害性天气的发生发展和预报研究课件
- 西安大唐不夜城的项目整体推广的策略提案的报告课件
- 可下载打印的公司章程
- 少先队辅导员工作记录表(共7页)
- 公开课教学评价表
- 消防验收规范标准(最新完整版)19844
- 教研工作手册
评论
0/150
提交评论