|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。我们在写Remoting程序大概其他的一些使用程序的时分不免要和线程打交道,.Net使我们很简单就能够创立一个线程,可是它供应的创立线程和启动线程的办法没有分明的供应参数,假设我们要用线程来启动类内里一个带参数的办法该怎样办?上面就复杂的先容怎样利用.NET供应的丰厚的框架来完成这个功效。为了能够活泼具体的先容全部历程,我创建上面的一个.NET类,它也是要用线程启动的办法的载体。类以下所示:
usingSystem;
namespaceWindowsApplication1
{
///<summary>
///SummarydescriptionforUrlFetcher.
///</summary>
publicclassMyClass{
//formethod1
privatestring_parameter;
publicMyClass(stringparameter){
this._parameter=parameter;
}
publicvoidMyMethod1(){
if(this._parameter!=null){
//dosomething
Console.Write(this._parameter);
}
}
//formethod2
publicMyClass(){}
//thismethodisprivate,Butitcanbepublicorother
privatevoidMyMethod2(stringparameter){
//dosomething
Console.Write(parameter);
}
//BecausedelegateWaitCallbacksparameterTypeisobject
//Iwillconvertittostring.
publicvoidMyMethod2(objectparameter){
this.MyMethod2((string)parameter);
}
//formethod3
publicstringMyMethod3(stringparameter){
return"参数值为:"+parameter;
}
//formutil-parameterspassed
publicstringMyMutilParameters(stringparam1,stringparam2){
return"参数1和参数2毗连了局为:"+param1+param2;
}
}
}
嘿嘿,我的英语不可,正文写的欠好请包涵(由于利用的是英文的),但愿没有影响您的浏览。我想我有需要复杂的说一下下面这个类里内里的所包括的内容。起首包括两个机关函数,一个带参数一个不带(这里但是成心布置的)。经由过程类中其他办法的名字我想您必定猜出来我将先容3种办法来传送参数,接上去我将一一先容。起首我们看看怎样启动一个线程,起首我们能够用一个函数来实例化ThreadStart托付的一个实例,然后在利用这个实例作为参数new线程(Thread)工具,最初将这个线程Start就能够了,想懂得更多请参考MSDN文档的Thread部分。
为了测试我们的了局我创建了一个WinForm的工程,个中有一个Form和4个按钮,假如你必要一切的源码请发送邮件到wu_jian830@hotmail.com,假如我偶然间我会给你发已往的。接上去是每种办法的具体形貌。
1、利用机关函数来传送参数
尽人皆知,我们可使用一个带参数的机关函数来机关工具,既然如许我们能够使用机关函数先将要利用的参数值传送到工具内里的外部变量上,然后再利用一个无参数的办法来利用这个参数(伪装参数)。复杂的说就是,在类内里声明一个变量专门用来保留函数必要的参数,函数酿成无参的情势。这类办法的最年夜成绩就是损坏了封装性,固然我们不克不及间接办法这些变量可是隐患老是存在的(大概说看上往不爽都能够)。上面代码片段给出了怎样利用这个办法来传送参数的具体内容,这也是下面提到的4个按钮中的一个按钮(Button1)的Click代码。为了有参数可传我在WinForm全局界说了一个以下的变量:
//Thisisparametersvalue
privatestringmyParameter="ParameterValue
";
按钮事务以下所示:
//passedparameterstothreadbyconstruct
privatevoidbutton1_Click(objectsender,System.EventArgse){
MyClassinstance=newMyClass(myParameter);
newThread(newThreadStart(instance.MyMethod1)).Start();
}
正如下面所说的,我们利用机关函数传送参数到类内里往,然后在利用下面所说的办法启动了一个线程,我们能够在运转该程序后的output窗口中看到MyMethod1的实行了局是(你也能够用一个TextBox大概其他甚么器材间接显现在WinForm上):ParameterValue。看看函数体就晓得这个了局是准确的。是否是很复杂。
2、利用ThreadPool来完成参数的传送
我们起首能够看看MSDN对ThreadPool是怎样描述的,Providesapoolofthreadsthatcanbeusedtopostworkitems,processasynchronousI/O,waitonbehalfofotherthreads,andprocesstimers.检察它的办法汇合个中有一个叫:QueueUserWorkItem的办法,该类和该办法的具体信息请参考MSDN相干匡助。这里必要注重的就是QueueUserWorkItem办法的参数,参数WaitCallback是一个托付范例,第二个参数就是该托付实例(用函数实例化今后,也就是一个函数)所必要的参数,是object范例的。具体内容请看上面的代码。
//passedparametertothreadbyThreadPool
privatevoidbutton2_Click(objectsender,System.EventArgse){
MyClassinstance=newMyClass();
ThreadPool.QueueUserWorkItem(newWaitCallback(instance.MyMethod2),myParameter);
}
由于QueueUserWorkItem的二个参数是object范例的以是我们要在MyClass内里界说两个MyMethod2的重裁版本,目标就是为了满意该办法的参数。一样我们将参数myParameter传送出来了,运转程序,当我们点击Button2的时分在output窗口中将会呈现MyMethod2将myParameter作为参数实行的了局显现出来。
3、接上去是最初一种办法利用异步托付来完成参数的传送
一样,有关托付的具体信息能够参考MSDN,下面说的十分具体。我们这里要利用到BeginInvoke和EndInvoke办法。起首我们给出传送一个参数的办法以下所示:
//passedparameterbyasynchronousdelegate
delegatestringMyMethod3Delegate(stringparameter);
privatevoidbutton3_Click(objectsender,System.EventArgse){
MyClassinstance=newMyClass();
MyMethod3DelegatemyMethod3=newMyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInvoke("parameterValue",newAsyncCallback(AfterMyMothod3),null);
}
publicvoidAfterMyMothod3(IAsyncResultresult){
AsyncResultasync=(AsyncResult)result;
MyMethod3DelegateDelegateInstance=(MyMethod3Delegate)async.AsyncDelegate;
Console.WriteLine("函数挪用前往值:{0}
",DelegateInstance.EndInvoke(result));
}
起首为了利用托付我们声了然一个MyMethod3Delegate的托付,该托付申明一个参数和前往值为string的函数是切合前提的,以是我们在MyClass内里界说了一个MyMethod3的办法。该函数的型构切合下面的托付,以是我们能够在Button3点击的时分用这个办法实例化一个托付,然后我们利用异步的体例挪用这个办法,为了失掉前往了局我们写了AfterMyMothod3办法用来显现该函数的实行了局。运转程序点击Button3能够看到Output中输入的了局为MyMethod3带参数实行的了局。最初我给出怎样传送多个参数的办法,我的例子是传送2个参数。代码以下:
//mutil-parameterspassed
delegatestringMyMutilParamsDelegate(stringparameter1,stringparameter2);
privatevoidbutton4_Click(objectsender,System.EventArgse){
MyClassinstance=newMyClass();
MyMutilParamsDelegatemutilParams=newMyMutilParamsDelegate(instance.MyMutilParameters);
mutilParams.BeginInvoke("param1","params2",newAsyncCallback(AfterMutilParams),null);
}
publicvoidAfterMutilParams(IAsyncResultresult){
AsyncResultasync=(AsyncResult)result;
MyMutilParamsDelegateDelegateInstance=(MyMutilParamsDelegate)async.AsyncDelegate;
Console.WriteLine("多参数函数挪用前往了局:{0}
",DelegateInstance.EndInvoke(result));
}
因为篇幅干系代码就不作具体申明了。有不准确的中央请斧正,感谢浏览!接洽体例:wu_jian830@hotmail.comCSDN论坛ID:cuike519
参考文档:
http://www.codeproject.com/Purgatory/ThreadsinC_.asp
http://www.msdn.com
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情! |
|