C#如何在线程中调用带参数的方法并返回一些值我喜欢在线程中调用带参数的方法并返回一些值这里示例类程序{staticvoidMain(){ThreadFirstThread=newThread(newThreadStart(Fun1));线程SecondThread=newThread(newThreadStart(Fun2));FirstThread.开始();SecondThread.Start();}publicstaticvoidFun1(){for(inti=1;i=6;i--){Console.WriteLine("Fun2writes:{0}",i);}}}i知道上面的例子运行成功了,但是如果方法fun1是这样的publicintfun1(inti,intj){intk;k=i+j;返回k;那么如何在线程中调用呢?这可能是另一种方法。这里输入作为参数化传递,返回类型在委托事件中传递,以便在线程完成时调用委托。当线程完成时,这将很好地得到结果。公共类ThreadObject{publicinti;公共诠释j;公共整数结果;公共字符串名称;}公共委托voidResultDelegate(ThreadObjectthreadObject);publicpartialclassForm1:Form{publiceventResultDelegateresultDelete;publicForm1(){InitializeComponent();resultDelete+=newResultDelegate(resultValue);}voidresultValue(ThreadObjectthreadObject){MessageBox.Show("线程名称:"+threadObject.Name+"线程值:"+threadObject.result);}privatevoidbutton1_Click(objectsender,EventArgse){ThreadObjectfirstThreadObject=newThreadObject();firstThreadObject.i=0;firstThreadObject.j=100;firstThreadObject.Name="第一个线程";线程firstThread=newThread(Fun);firstThread.Start(firstThreadObject);ThreadObjectsecondThreadObject=newThreadObject();secondThreadObject.i=0;secondThreadObject.j=200;secondThreadObject.Name="第二个线程";线程secondThread=newThread(Fun);第二线程.Start(secondThreadObject);}privatevoidFun(objectparameter){ThreadObjectthreadObject=parameterasThreadObject;for(;threadObject.i你应该能够使用匿名方法或lambdas来提供完整的静态检查:ThreadFirstThread=newThread(()=>Fun1(5,12));或者如果你想对结果做些什么:ThreadFirstThread=newThread(()=>{inti=Fun1(5,12);//dosomethingwithi});但是请注意,这个“做某事”仍然在新线程的上下文中运行(但是可以访问外部方法(Main)中的其他变量,由“捕获变量”提供)如果您有C#2.0(而不是更高版本),则:ThreadFirstThread=newThread((ThreadStart)delegate{Fun1(5,12);});andThreadFirstThread=newThread((ThreadStart)delegate{inti=Fun1(5,12);//dosomethingwithi});我喜欢MarkGravell的回答。稍微修改一下,就可以将结果传回主线程:intfun1,fun2;线程FirstThread=newThread(()=>{fun1=Fun1(5,12);});线程SecondThread=newThread(()=>{fun2=Fun2(2,3);});FirstThread.开始();SecondThread.Start();FirstThread.Join();SecondThread.Join();Console.WriteLine("Fun1返回{0},Fun2返回{1}",fun1,fun2);有一种更简单的方法可以在单独的线程中执行函数://创建函数委托(它可以是任何委托)varFunFunc=newFunc(fun1);//开始在带参数的线程池上执行函数IAsyncResultFunFuncResult=FunFunc.BeginInvoke(1,5,null,null);//做一些事情//等待异步调用完成并获取结果intResult=FunFunc.EndInvoke(FunFuncResult);函数将在线程池线程上执行,此逻辑对您的应用程序是完全透明的。一般来说,我建议在线程池而不是专用线程上执行这样的小任务。您可以在Thread构造函数上使用ParameterizedThreadStart重载。它允许您将对象作为参数传递给线程方法。它将是一个Object参数,所以我通常会像这样为线程创建一个参数类。该对象还可以存储线程执行的结果,线程结束后可以读取。不要忘记在线程运行时访问这个对象是可能的,但不是“线程安全的”。你知道该怎么做:)这是一个例子:voidMain(){varthread=newThread(Fun);varobj=newThreadObject{i=1,j=15,};线程。开始(对象);线程.Join();控制台.WriteLine(obj.result);}publicstaticvoidFun(Objectobj){varthreadObj=objasThreadObject;threadObj.result=threadObj.i+threadObj.j;}publicclassThreadObject{publicinti;公共诠释j;公共整数结果;对于一些替代品;Curry:staticThreadStartCurryForFun(inti,intj){//如果Fun1不是staticreturn()=>Fun1(i,j);也需要一个目标对象}ThreadFirstThread=newThread(CurryForFun(5,12));或编写您自己的捕获类型(这大致相当于编译器为您执行的操作,当您将匿名方法/lambda与捕获变量一起使用,但实现不同的方法时):诠释?结果;//仅在执行后可用publicintResult{get{returnresult.Value;}}publicMyCaptureClass(inti,intj){this.i=i;这个.j=j;}publicvoidInvoke(){//如果Fun1不是静态的,则还需要一个目标对象result=Fun1(i,j);}}...米yCaptureClasscapture=newMyCaptureClass(5,12);线程FirstThread=newThread(capture.Invoke);//那么以后访问capture.ResulttrybackgroundWorkerhttp://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx可以使用DoWorkEventArgs将值传递给DoWork事件并反转RunWorkerCompleted中的值以上就是C#学习教程:Howtocallthemethodinthethreadwithparametersandreturnsomevalueshared的全部内容,如果对你有用还需要进一步了解C#学习教程,希望各位多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
