欢迎来到天天文库
浏览记录
ID:40532692
大小:37.00 KB
页数:5页
时间:2019-08-04
《C#多线程函数如何传参数和返回值》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C#多线程函数如何传参数和返回值提起多线程,不得不提起委托(delegates)这个概念.我理解的委托就是具有同样参数和返回值的函数的集合.比如publicdelegatevoidMyDelegate(intarg);就是这种形式的函数voidMyfuntion(inti);的集合.如何将一个函数加入委托的集合?MyDelegatedele=newMyDelegate(Myfuntion1);再增加一个dele+=newMyDelegate(Myfuntion2);...委托函数dele就是具有整数参数和空返回值的函数Myfuntion1,2的集合.调用这个委托函数dele(1);
2、就是逐个调用Myfuntion1,2,...一般线程函数的声明和启动Threadt=newThread(newThreadStart(MyFunction));t.Start();正是调用了没有参数和返回值的委托函数ThreadStart其中的参数MyFunction是这个委托函数中的一员.很明显这样无法传参数和返回值,那我们该怎么办?答案就在委托的BeginInvoke()方法上,BeginInvoke()也是(异步)启动一个新线程.例如MyDelegatedele=newMyDelegate(MyFunction);dele.BeginInvoke(10,"abcd");voi
3、dMyFunction(intcount,stringstr);可以实现参数的传递.如何收集线程函数的返回值?与BeginInvoke对应有个EndInvoke方法,而且运行完毕返回IAsyncResult类型的返回值.这样我们可以这样收集线程函数的返回值MyDelegatedele=newMyDelegate(MyFunction);IAsyncResultref=dele.BeginInvoke(10,"abcd");...intresult=dele.EndInvoke(ref);<----收集返回值intMyFunction(intcount,stringstr);<---
4、-带参数和返回值的线程函数提示:"线程间操作无效:从不是创建控件“XX”的线程访问它"一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。现在用一个用线程控制的进程条来说明,大致的步骤如下:1.创建Invoke函数,大致如下://////Delegatefunctiontobeinvokedbymainthread///privatevoidInvokeFun(
5、){if(prgBar.Value<100)prgBar.Value=prgBar.Value+1;}2.子线程入口函数://////Threadfunctioninterface///privatevoidThreadFun(){//CreateinvokemethodbyspecificfunctionMethodInvokermi=newMethodInvoker(this.InvokeFun);for(inti=0;i<100;i++){this.BeginInvoke(mi);Thread.Sleep(100);}}3.创建子线程:ThreadthdProcess=new
6、Thread(newThreadStart(ThreadFun));thdProcess.Start();出现这个问题主要是因为在线程方法中操作了界面上的控件..lstPrime.Items.Add()可以这样改下..//定义一个委托publicdelegatevoidMyInvoke(stringstr);//定义一个操作界面的方法privatevoidUpdateUI(stringstr){ //增加项 this.lstPrime.Items.Add(str);}//在线程的方法中,即你的Generate方法..//里面只要是涉及到Items.Add操作的都改成如下形式即可
7、..//比如lstPrime.Items.Add(2);改成:MyInvokemi=newMyInvoke(UpdateUI);this.BeginInvoke(mi,newobject[]{"2"});============================================================================BeginInvoke与Invoke的含义[转载]BeginInvoke方法真的是新开一个线程进行异步调用吗?参考以
此文档下载收益归作者所有