知识大全 VisualC#多线程参数传递浅析

Posted

篇首语:积极思考造成积极人生,消极思考造成消极人生。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VisualC#多线程参数传递浅析相关的知识,希望对你有一定的参考价值。

VisualC#多线程参数传递浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

我们在写Remoting程序或者其他的一些应用程序的时候难免要和线程打交道使我们很容易就可以创建一个线程 但是它提供的创建线程和启动线程的方法没有明显的提供参数 假如我们要用线程来启动类里面一个带参数的方法该怎么办?下面就简单的介绍如何使用 NET提供的丰富的框架来实现这个功能 为了可以生动详细的介绍整个过程 我建立下面的一个 NET类 它也是要用线程启动的方法的载体 类如下所示 using System;namespace WindowSAPplication  /// <summary> /// Summary description for UrlFetcher  /// </summary> public class MyClass  // for method   private string _parameter;  public MyClass(string parameter)   this _parameter = parameter;   public void MyMethod ()  if(this _parameter!=null)   // do something   Console Write(this _parameter);    // for method  public MyClass() // this method is private But it can be public or other private void MyMethod (string parameter)  // do something  Console Write(parameter);  // Because delegate WaitCallback s parameter Type is object  // I will convert it to string  public void MyMethod (object parameter)  this MyMethod ((string)parameter);  // for method  public string MyMethod (string parameter)  return 参数值为 +parameter;  // for mutil parameters passed public string MyMutilParameters(string param string param )  return 参数 和参数 连接结果为 +param +param ;   嘿嘿 我的英语不行 注释写的不好请见谅(因为使用的是英文的) 希望没有影响您的阅读 我想我有必要简单的说一下上面这个类里里面的所包含的内容 首先包含两个构造函数 一个带参数一个不带(这里可是有意安排的) 通过类中其他方法的名字我想您一定猜出来我将介绍 种方法来传递参数 接下来我将逐一介绍 首先我们看看如何启动一个线程 首先我们可以用一个函数来实例化ThreadStart委托的一个实例 然后在使用这个实例作为参数new线程(Thread)对象 最后将这个线程Start就可以了 想了解更多请参考MSDN文档的Thread部分   为了测试我们的结果我建立了一个WinForm的工程 其中有一个Form和 个按钮 如果你需要所有的源码请发送邮件到wu 如果我有时间我会给你发过去的 接下来是每种方法的详细描述    使用构造函数来传递参数  众所周知 我们可以使用一个带参数的构造函数来构造对象 既然这样我们可以利用构造函数先将要使用的参数值传递到对象里面的内部变量上 然后再使用一个无参数的方法来使用这个参数(假装参数) 简单的说就是 在类里面声明一个变量专门用来保存函数需要的参数 函数变成无参的形式 这种方法的最大问题就是破坏了封装性 虽然我们不能直接方法这些变量但是隐患总是存在的(或者说看上去不爽都可以) 下面代码片断给出了如何使用这个方法来传递参数的详细内容 这也是上面提到的 个按钮中的一个按钮(Button )的Click代码 为了有参数可传我在WinForm全局定义了一个如下的变量 // This is parameter s valueprivate string myParameter = ParameterValue\\n ;  按钮事件如下所示 // passed parameters to thread by constructprivate void button _Click(object sender System EventArgs e)  MyClass instance = new MyClass(myParameter); new Thread (new ThreadStart(instance MyMethod )) Start();  正如上面所说的 我们使用构造函数传递参数到类里面去 然后在使用上面所说的方法启动了一个线程 我们可以在运行该程序后的output窗口中看到MyMethod 的执行结果是(你也可以用一个TextBox或者其他什么东西直接显示在WinForm上) ParameterValue 看看函数体就知道这个结果是正确的 是不是很简单    使用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 ThreadPoolprivate void button _Click(object sender System EventArgs e)  MyClass instance = new MyClass(); ThreadPool QueueUserWorkItem (new WaitCallback (instance MyMethod ) myParameter);  因为QueueUserWorkItem的二个参数是object类型的所以我们要在MyClass里面定义两个MyMethod 的重裁版本 目的就是为了满足该方法的参数 同样我们将参数myParameter传递进去了 运行程序 当我们点击Button 的时候在output窗口中将会出现MyMethod 将myParameter作为参数执行的结果显示出来    接下来是最后一种方法使用异步委托来实现参数的传递  同样 有关委托的详细信息可以参考MSDN 上面说的非常详细 我们这里要使用到BeginInvoke和EndInvoke方法 首先我们给出传递一个参数的方法如下所示 // passed parameter by asynchronous delegatedelegate string MyMethod Delegate(string parameter);private void button _Click(object sender System EventArgs e)  MyClass instance = new MyClass(); MyMethod Delegate myMethod = new MyMethod Delegate(instance MyMethod ); myMethod BeginInvoke( parameterValue new AsyncCallback(AfterMyMothod ) null);public void AfterMyMothod (IAsyncResult result) AsyncResult async = (AsyncResult) result; MyMethod Delegate DelegateInstance = (MyMethod Delegate) async AsyncDelegate; Console WriteLine ( 函数调用返回值 \\n DelegateInstance EndInvoke(result));

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

// mutil parameters passeddelegate string MyMutilParamsDelegate(string parameter string parameter );private void button _Click(object sender System EventArgs e)  MyClass instance = new MyClass(); MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate(instance MyMutilParameters); mutilParams BeginInvoke( param params new AsyncCallback(AfterMutilParams) null);public void AfterMutilParams(IAsyncResult result) AsyncResult async = (AsyncResult) result; MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async AsyncDelegate; Console WriteLine ( 多参数函数调用返回结果 \\n DelegateInstance EndInvoke(result));  由于篇幅关系代码就不作详细说明了 有不正确的地方请指正 谢谢阅读! cha138/Article/program/net/201311/12317

相关参考

知识大全 浅析Java多线程编程中的高级技术

浅析Java多线程编程中的高级技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 向线程传递数据的三种方法

Java多线程初学者指南(7):向线程传递数据的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Visual C#中编写多线程程序之起步

VisualC#中编写多线程程序之起步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  net将关

知识大全 C# 跨线程调用TextBox方法浅析

C#跨线程调用TextBox方法浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 Java向线程传递数据的三种方法

Java向线程传递数据的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在传统的同步开发

知识大全 浅析Java多线程程序设计机制

浅析Java多线程程序设计机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多线程是Java语

知识大全 c#中通过值和引用传递参数

  在C#中既可以通过值也可以通过引用传递参数通过引用传递参数允许函数成员(方法属性索引器运算符和构造函数)更改参数的值并保持该更改若要通过引用传递参数请使用ref或out关键字为简单起见本主题的示例

知识大全 Jsp传递中文参数详解

Jsp传递中文参数详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目前在jsp页面中传递中文

知识大全 访问WebService传递复杂参数

访问WebService传递复杂参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据类型(A

知识大全 如何解决JSP参数传递乱码

如何解决JSP参数传递乱码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  计算机生于美国英语是他