C#多线程函数如何传参数和返回值

C#多线程函数如何传参数和返回值

ID:40532692

大小:37.00 KB

页数:5页

时间:2019-08-04

C#多线程函数如何传参数和返回值_第1页
C#多线程函数如何传参数和返回值_第2页
C#多线程函数如何传参数和返回值_第3页
C#多线程函数如何传参数和返回值_第4页
C#多线程函数如何传参数和返回值_第5页
资源描述:

《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方法真的是新开一个线程进行异步调用吗?参考以

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。