All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
总结:动态网页制作PHP常用的正则表达式_php资料_编程技术
十七 翻新标准_[Html教程]
asp.net2.0母版页与内容页的创建
MFC应用程序的开发流程
PHP生成图片缩略图_[PHP教程]
2种删除SQL SERVER数据库日志方法_[SQL Server教程]
asp.net点击textbox自动清除其中文字_[Asp.Net教程]
轻松掌握Ajax.net系列教程十:使用CollapsiblePanelExtender_[Asp.Net教程]
SQL注入漏洞全接触(进阶篇)_[SQL,Server教程]
PHP转到另一网页实现办法一,二,三_[PHP教程]
Reading number is top 10 pictures
29 the belle stars after bath figure5
南昌铁路局攸县车站125户铁路职工微利房终成骗局
The other a successor of sora aoi
西班牙山村小景1
Average female college students1
好身材能把衣服穿出3D效果
Go to the national museum1
餐桌上的鱼
The money of more than 100 countries and regions6
Ashlynn Brooke show proud chest measurement3
Download software ranking
Unix video tutorial19
C#高级编程(第4版)
Sora aoi, the maid, students' uniforms
Boxer vs Yellow3
asp.netWeb服务器高级编程
Detective task-the top secret prostitution files
C#程序员参考手册
linux初级教程
Tram sex maniac 2 (H) rar bag9
艳兽都市
aaa published in(发表于) 2013/12/18 8:02:18 Edit(编辑)
Visual,C#多线程参数传递浅析_.net资料_编程技术

Visual,C#多线程参数传递浅析_.net资料_编程技术

Visual C#多线程参数传递浅析_.net资料_编程技术-你的首页-uuhomepage.com
  我们在写Remoting程序或者其他的一些应用程序的时候难免要和线程打交道,.Net使我们很容易就可以创建一个线程,但是它提供的创建线程和启动线程的方法没有明显的提供参数,假如我们要用线程来启动类里面一个带参数的方法该怎么办?下面就简单的介绍如何使用.NET提供的丰富的框架来实现这个功能。为了可以生动详细的介绍整个过程,我建立下面的一个.NET类,它也是要用线程启动的方法的载体。类如下所示:


using System;
namespace WindowsApplication1
{
 ///


 /// Summary description for UrlFetcher.
 ///

 public class MyClass{
  // for method 1
  private string _parameter;
  public MyClass(string parameter){
   this._parameter = parameter;
  }
 public void MyMethod1(){
  if(this._parameter!=null){
   // do something
   Console.Write(this._parameter);
  }
 }
 // for method 2
 public MyClass(){}
 // this method is private,But it can be public or other
 private void MyMethod2(string parameter){
  // do something
  Console.Write(parameter);
 }
 // Because delegate WaitCallback's parameter Type is object
 // I will convert it to string.
 public void MyMethod2(object parameter){
  this.MyMethod2((string)parameter);
 }
 // for method 3
 public string MyMethod3(string parameter){
  return "参数值为:"+parameter;
 }
 // for mutil-parameters passed
 public string MyMutilParameters(string param1,string param2){
  return "参数1和参数2连接结果为:"+param1+param2;
 }
}
}

  嘿嘿,我的英语不行,注释写的不好请见谅(因为使用的是英文的),希望没有影响您的阅读。我想我有必要简单的说一下上面这个类里里面的所包含的内容。首先包含两个构造函数,一个带参数一个不带(这里可是有意安排的)。通过类中其他方法的名字我想您一定猜出来我将介绍3种方法来传递参数,接下来我将逐一介绍。首先我们看看如何启动一个线程,首先我们可以用一个函数来实例化ThreadStart委托的一个实例,然后在使用这个实例作为参数new线程(Thread)对象,最后将这个线程Start就可以了,想了解更多请参考MSDN文档的Thread部分。

  为了测试我们的结果我建立了一个WinForm的工程,其中有一个Form和4个按钮,如果你需要所有的源码请发送邮件到wu_jian830@hotmail.com,如果我有时间我会给你发过去的。接下来是每种方法的详细描述。

  1、使用构造函数来传递参数

  众所周知,我们可以使用一个带参数的构造函数来构造对象,既然这样我们可以利用构造函数先将要使用的参数值传递到对象里面的内部变量上,然后再使用一个无参数的方法来使用这个参数(假装参数)。简单的说就是,在类里面声明一个变量专门用来保存函数需要的参数,函数变成无参的形式。这种方法的最大问题就是破坏了封装性,虽然我们不能直接方法这些变量但是隐患总是存在的(或者说看上去不爽都可以)。下面代码片断给出了如何使用这个方法来传递参数的详细内容,这也是上面提到的4个按钮中的一个按钮(Button1)的Click代码。为了有参数可传我在WinForm全局定义了一个如下的变量:


// This is parameter's value
private string myParameter = "ParameterValue\n";

  按钮事件如下所示:

// passed parameters to thread by construct
private void button1_Click(object sender, System.EventArgs e) {
 MyClass instance = new MyClass(myParameter);
 new Thread (new ThreadStart(instance.MyMethod1)).Start();
}

  正如上面所说的,我们使用构造函数传递参数到类里面去,然后在使用上面所说的方法启动了一个线程,我们可以在运行该程序后的output窗口中看到MyMethod1的执行结果是(你也可以用一个TextBox或者其他什么东西直接显示在WinForm上):ParameterValue 。看看函数体就知道这个结果是正确的。是不是很简单。

  2、使用ThreadPool来实现参数的传递

  我们首先可以看看MSDN对ThreadPool是怎么形容的,Provides a pool of threads that can be used to post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.查看它的方法集合其中有一个叫:QueueUserWorkItem 的方法,该类以及该方法的详细信息请参考MSDN相关帮助。这里需要注意的就是QueueUserWorkItem方法的参数,参数WaitCallback是一个委托类型,第二个参数就是该委托实例(用函数实例化以后,也就是一个函数)所需要的参数,是object类型的。详细内容请看下面的代码。


// passed parameter to thread by ThreadPool
private void button2_Click(object sender, System.EventArgs e) {
 MyClass instance = new MyClass();
 ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter);
}

  因为QueueUserWorkItem的二个参数是object类型的所以我们要在MyClass里面定义两个MyMethod2的重裁版本,目的就是为了满足该方法的参数。同样我们将参数myParameter传递进去了,运行程序,当我们点击Button2的时候在output窗口中将会出现MyMethod2将myParameter作为参数执行的结果显示出来。

  3、接下来是最后一种方法使用异步委托来实现参数的传递

  同样,有关委托的详细信息可以参考MSDN,上面说的非常详细。我们这里要使用到BeginInvoke和EndInvoke方法。首先我们给出传递一个参数的方法如下所示:


// passed parameter by asynchronous delegate
delegate string MyMethod3Delegate(string parameter);
private void button3_Click(object sender, System.EventArgs e) {
 MyClass instance = new MyClass();
 MyMethod3Delegate myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
 myMethod3.BeginInvoke("parameterValue",new AsyncCallback(AfterMyMothod3),null);
}
public void AfterMyMothod3(IAsyncResult result){
 AsyncResult async = (AsyncResult) result;
 MyMethod3Delegate DelegateInstance = (MyMethod3Delegate) async.AsyncDelegate;
 Console.WriteLine ("函数调用返回值:{0}\n", DelegateInstance.EndInvoke(result));
}

  首先为了使用委托我们声明了一个MyMethod3Delegate的委托,该委托说明一个参数和返回值为string的函数是符合条件的,所以我们在MyClass里面定义了一个MyMethod3的方法。该函数的型构符合上面的委托,所以我们可以在Button3点击的时候用这个方法实例化一个委托,然后我们使用异步的方式调用这个方法,为了得到返回结果我们写了AfterMyMothod3方法用来显示该函数的执行结果。运行程序点击Button3可以看到Output中输出的结果为MyMethod3带参数执行的结果。最后我给出如何传递多个参数的方法,我的例子是传递2个参数。代码如下:


// mutil-parameters passed
delegate string MyMutilParamsDelegate(string parameter1,string parameter2);
private void button4_Click(object sender, System.EventArgs e) {
 MyClass instance = new MyClass();
 MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate(instance.MyMutilParameters);
 mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null);
}
public void AfterMutilParams(IAsyncResult result){
 AsyncResult async = (AsyncResult) result;
 MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
 Console.WriteLine ("多参数函数调用返回结果:{0}\n", DelegateInstance.EndInvoke(result));
}

  由于篇幅关系代码就不作详细说明了。有不正确的地方请指正,谢谢阅读!



添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.