C#中的线程C#中的线程如何在C#中使用线程来调用带有两个参数的函数?我必须从另一个函数调用StartDNIThread(stringstoreID,stringqueryObject)。我必须传递两个值。它们都是字符串ThreadStartthreadStart=delegate{StartDNIThread(stringstoreID,stringqueryObject);};线程thread=newThread(threadStart);线程。开始();或者使用lambda:ThreadStartthreadStart=()=>StartDNIThread(stringstoreID,stringqueryObject);线程thread=newThread(threadStart);线程。开始();您的选择是:后者通常更容易。您没有在线程中显示您在做什么,但您可能正在执行以下操作:stringstoreID="...";字符串查询对象="...";Threadt=newThread(()=>StartDNIThread(storeID,queryObject));t.开始();注意,因为变量是被捕获的,所以在知道线程真正开始之前,这些值是不能改变的。您可以通过使用仅由匿名函数使用的捕获变量来解决此问题:stringstoreID="...";字符串查询对象="...";字符串storeIDCopy=storeID;字符串queryObjectCopy=queryObject;Threadt=newThread(()=>StartDNIThread(storeIDCopy,queryObjectCopy));t.开始();//您现在可以自由更改storeID和queryObject如果您在循环中执行任何操作,这一点尤其重要,因为循环变量本身会发生变化。Foreach(商店中的字符串storeID){字符串storeIDCopy=storeID;Threadt=newThread(()=>StartDNIThread(storeIDCopy,queryObject));t.开始();如果你是使用线程池或者任何其他方式启动线程,那么模式基本相同。使用线程池:stringstr1="str1";字符串str2="str2";ThreadPool.QueueUserWorkItem(state=>{Console.WriteLine("{0}:{1}",str1,str2);});如果要进行涉及UI的备用线程处理,最好使用BackgroundWorker。您可以使用ParameterizedThreadStart委托。该委托需要一个带有一个参数(tyoe对象)的方法。所以实际上您可以使用带有2个变量的自定义类型(类或结构)传递给ParameterizedThreadStart。像这样:Threadt=newThread(newParameterizedThreadStart(DoWork));t.Start(newMyType(storeId,queryObject));但是,在这种情况下,我宁愿用另一种方式来做。我更喜欢创建一个自定义的“任务”类型来抽象所有这些东西。像这样:publicclassTask{privatereadonlyint_storeId;私有只读字符串_queryObject;publicTask(intstoreId,stringqueryObject){_storeId=storeId;_queryObject=查询对象;}publicvoidStart(){Threadt=newThread(newThreadStart(DoWork));t.开始();}privatevoidDoWork(){//在这里做你的事。我倾向于创建一个像这样的任务对象classmyClass{publicvoidCallingCode(){ProcessRequestpr1=newProcessRequest("storeD","queryObj");ThreadStartts1=newThreadStart(pr1.Go);线程wrk=新线程(ts1);wrk.开始();}}classProcessRequest{privatestringstoreD;;publicProcessRequest(stringstoreD,stringqueryObj){this.stroreD=storeD;this.queryObj=queryObj;}publicvoidGo(){try{//你的处理代码在这里你可以访问$this->storeD和$this->queryObj}catch(Exceptionex){}}}我个人比较喜欢代表路线:以上是C#学习教程:c#中threading分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——privatedelegatevoidStartDNIThreadDelegate(字符串存储ID,字符串查询对象);privatestaticvoidMain(){stringstoreID="...";字符串查询对象="...";StartDNIThreadDelegatestartDNIThread=newStartDNIThreadDelegate(StartDNIThread);IAsyncResult结果=startDNIThread.BeginInvoke(storeID,queryObject,newAsyncCallback(StartDNIThreadDone),startDNIThread);//做非线程的事情...result.AsyncWaitHandle.WaitOne();//等待线程完成。}privatestaticvoidStartDNIThread(stringstoreID,stringqueryObject){//做StartDNIThreading的事情。}privatestaticvoidStartDNIThreadDone(IAsyncResultresult){StartDNIThreadDelegatestartDNIThread=(StartDNIThreadDelegate)result.AsyncState;//线程完成后执行cleanup.startDNIThread.EndInvoke(result);代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
