问题描述
我想10个线程同时执行一个方法,但是每个方法传入的参数是不一样的!我在网上找了些代码,但是不行,造成线程混乱,谁能教教我啊!!想要实现的是:10个线程同时去登陆网站,然后采集东西。当然我也有10个用户名。10个线程每个线程对应一个用户。
解决方案
解决方案二:
分太少了。不然老夫贴出来
解决方案三:
ThreadPool.QueueUserWorkItem();
解决方案四:
给你个多线程的例子privatevoidbtnDataUp_Click(objectsender,RoutedEventArgse){Threadthread=newThread(GetDataUp);//创建一个线程其中GetDataUp是该线程要执行的方法thread.Start();//该线程运行无论上述线程是否执行完毕都继续执行一下代码lblUpdateMessage.Visibility=Visibility.Visible;}privatevoidGetDataUp(){//执行的代码Actionaction;//封装一个方法该方法不具备参数并且不返回值action=()=>{//执行的代码};btnDataUp.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle,action);//关联的线程上异步执行委托执行Action方法}
解决方案五:
publicabstractclassBaseProcessor{publicBaseProcessor(){m_SyncEvents=newSyncEvents();m_Thread=null;m_ExitTimeOut=500;m_WorkTimeOut=System.Threading.Timeout.Infinite;m_IsPause=false;m_IsStoping=false;m_ThreadName="";}publicBaseProcessor(intexitTimeOut,intworkTimeOut){m_SyncEvents=newSyncEvents();m_Thread=null;m_ExitTimeOut=exitTimeOut;m_WorkTimeOut=workTimeOut;}publicBaseProcessor(intexitTimeOut){m_SyncEvents=newSyncEvents();m_Thread=null;m_ExitTimeOut=exitTimeOut;m_WorkTimeOut=System.Threading.Timeout.Infinite;}publicboolIsPause{get{returnthis.m_IsPause;}}publicboolIsStoping{get{returnthis.m_IsStoping;}}publicvirtualvoidStart(){this.m_ExitObject=newExitObject();this.m_ExitObject.Reset();this.m_ExitObject.name=this.ThreadName;m_IsPause=false;m_IsStoping=false;if(m_Thread==null||!m_Thread.IsAlive){m_Thread=newThread(newThreadStart(this.DoWork));if(this.ThreadName!=string.Empty){m_Thread.Name=this.ThreadName;}this.SyncEventsHandle.ExitWaitHandle.Reset();m_Thread.Start();}m_SyncEvents.WorkWaitHandle.Set();}publicvirtualvoidDoNextStep(){m_SyncEvents.WorkWaitHandle.Set();}publicvirtualvoidStop(){m_IsStoping=true;if(m_Thread==null)return;try{this.BeforeStoping();this.SyncEventsHandle.ExitWaitHandle.Set();if(!m_Thread.Join(500)){m_Thread.Abort();}}catch(System.Exceptionex){System.Diagnostics.Debug.WriteLine(ex.Message.ToString());}this.m_Thread=null;}publicvirtualvoidPause(){m_IsPause=true;}publicSyncEventsSyncEventsHandle{get{returnm_SyncEvents;}}publicintExitTimeout{get{returnm_ExitTimeout;}set{m_ExitTimeout=value;}}publicintWorkTimeout{get{returnm_WorkTimeout;}set{m_WorkTimeout=value;}}publicstringThreadName{get{returnthis.m_ThreadName;}set{m_ThreadName=value;}}publicclassSyncEvents{publicenumEventType:int{Exist=0,Work=1,}publicSyncEvents(){m_ExitEvent=newEventWaitHandle(false,EventResetMode.ManualReset);m_WorkEvent=newEventWaitHandle(false,EventResetMode.AutoReset);m_EventArray=newEventWaitHandle[2];m_EventArray[0]=m_ExitEvent;m_EventArray[1]=m_WorkEvent;}publicEventWaitHandleExitWaitHandle{get{returnm_ExitEvent;}}publicEventWaitHandleWorkWaitHandle{get{returnm_WorkEvent;}}publicEventWaitHandle[]EventHandleArray{get{returnm_EventArray;}}privateEventWaitHandlem_ExitEvent;privateEventWaitHandlem_WorkEvent;privateEventWaitHandle[]m_EventArray;};privatevoidDoWork(){this.BeforeStart();intWaitResult;WaitResult=EventWaitHandle.WaitAny(this.SyncEventsHandle.EventHandleArray,m_WorkTimeOut,true);while((WaitResult==(int)SyncEvents.EventType.Work)||(WaitResult==EventWaitHandle.WaitTimeout)){if(!m_IsPause){if(!DoProcessor()){this.m_ExitObject.reason=PublicDefineDll.Enums.EExitReason.Finished;break;}}WaitResult=EventWaitHandle.WaitAny(this.SyncEventsHandle.EventHandleArray,m_WorkTimeOut,true);}if(WaitResult==(int)SyncEvents.EventType.Exist){this.m_ExitObject.reason=PublicDefineDll.Enums.EExitReason.UserAbort;}this.BeforeExit(this.m_ExitObject);}protectedabstractboolDoProcessor();protectedvirtualvoidBeforeExit(ExitObjecteo){System.Diagnostics.Debug.WriteLine(eo.ToString());}protectedvirtualvoidBeforeStart(){System.Diagnostics.Debug.WriteLine("ThreadStart:"+this.ThreadName);}///<summary>///在线程退出信号量有效之前的处理操作,不受退出时限限制///如果退出出时要做很长的耗时操作,重载这个函数实现///但由于这个函数很可能是主线程调用,因此要考虑同步和阻塞问题///</summary>protectedvirtualvoidBeforeStoping(){System.Diagnostics.Debug.WriteLine("Threadstoping:"+this.ThreadName);}protectedSyncEventsm_SyncEvents;protectedThreadm_Thread;protectedintm_ExitTimeout;protectedintm_WorkTimeout;protectedboolm_IsPause;protectedstringm_ThreadName;protectedExitObjectm_ExitObject;protectedboolm_IsStoping;publicclassExitObject{publicExitObject(){this.Reset();}publicvoidReset(){this.exitCode=-1;this.reason=PublicDefineDll.Enums.EExitReason.Invalid;this.description=string.Empty;this.name=string.Empty;}publicoverridestringToString(){StringBuildersb=newStringBuilder();sb.Append("ThreadName:");sb.Append(this.name);sb.Append("Reason:");sb.Append(this.reason.ToString());sb.Append("Description:");sb.Append(this.description);sb.Append("ExitCode:");sb.Append(this.exitCode.ToString());returnsb.ToString();}publicstringname;publicintexitCode;publicPublicDefineDll.Enums.EExitReasonreason;publicstringdescription;}}
老夫心好啊。贴的是可以重用的线程类。内部用内核对象实现。可以实现2种模式1事件驱动模式:每次调用DoNextStep执行一次.把workTimeOut设置到最大就可以2循环模式:每过一定时间,循环执行。3用户自己实现DoProcessor()接口,完成工作。returntrue继续returnfalse退出CMyThread:publicCBaseProcessor{publicCMyThread()::base(200,500){//200线程退出最大等待时间;//500线程每次执行等待时间}protectedoverrideboolDoProcessor(){返回true继续转。返回false退出。}}
解决方案六:
我现在也遇到和楼主相似的问题,请问楼主解决与否?!请指教~~~~~
解决方案七:
好东西不少