`
caoruntao
  • 浏览: 480842 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

C#多线程参数传递浅析

    博客分类:
  • c#
阅读更多

[转]http://www.shehui001.com/StudyWeb/CSharp/map.asp?pid=37

 

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

using System;
namespace WindowsApplication1
{
 /// <summary>
 /// Summary description for UrlFetcher.
 /// </summary>

 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));
}

分享到:
评论

相关推荐

    C#多线程参数传递浅析[借鉴].pdf

    本文主要讨论如何在C#中使用多线程并传递参数。.NET Framework为我们提供了多种方式来实现这一目标,我们将通过分析给定的代码示例来深入理解这三种方法。 首先,我们来看代码中的`MyClass`类,它包含了多种接收...

    VB.Net-C#多线程Thread-代理委托delegate编程

    Visual C#多线程参数传递浅析.txt WebBrowser控件-弹出新窗体和关闭窗口.txt WebBrowser控件的简单应用2.txt 多线程为基于.NET的应用程序实现响应迅速的用户.txt 浅述WinForm多线程编程与Control.Invoke的应用.txt ...

    C# 多线程 参数传递 示例

    本示例主要关注如何在多线程环境中传递参数,这对于创建复杂的并发应用至关重要。以下是关于"C# 多线程 参数传递 示例"的详细说明。 首先,让我们理解什么是多线程。线程是操作系统分配CPU时间的基本单元,一个进程...

    C#泛型参数多线程与复杂参数多线程2

    最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...

    C#多线程委托带参数

    *********************************************************...两个线程,利用委托更新主线程listBox1控件的内容,并将线程的名字传递过去 ***********************************************************************

    C#多线程编程实战 源代码

    本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...

    C#多线程编程实例实战.pdf

    C#多线程编程实例实战 C#多线程编程实例实战是指在C#语言中实现多线程编程的实例和实战经验。多线程编程是指在同一个进程中创建多个线程,以便提高程序的执行效率和响应速度。在C#语言中,可以使用Thread类和线程池...

    C#多线程读写sqlite

    在C#编程中,多线程技术常用于提高应用程序的执行效率,特别是在处理数据库操作时。SQLite是一款轻量级、嵌入式的关系型数据库,它广泛应用于桌面应用、移动设备和Web开发。当多线程环境对SQLite进行读写操作时,...

    关于C#多线程的函数示例

    如果我们需要在线程中传递参数,可以使用`ParameterizedThreadStart`委托。下面是一个带参数的线程函数示例: ```csharp public class MultiThreadExampleWithArgs { public void RunWithParameter(object data) ...

    c#编写串口通讯代码 多线程实现.rar_C#串口_c# 串口多线程_c#多线程_串口多线程_串口通信

    串口通信的实现,编程环境为C#,实现技术采用了多线程方式

    WinForm C# 多线程编程并更新界面(UI)

    WinForm C# 多线程编程并更新界面(UI) 在 Windows 窗体应用程序中,多线程编程是非常重要的,这样可以提高应用程序的响应速度和用户体验。下面我们来讨论如何在 WinForm 中使用 C# 实现多线程编程并更新界面(UI...

    C#多线程 C#多线程

    在C#编程中,多线程是一种允许程序同时执行多个任务的技术,它极大地提高了应用程序的性能和响应速度。本文将深入探讨C#中的多线程概念、线程池的使用以及如何通过实例理解其工作原理。 首先,多线程在C#中是通过`...

    C#多线程互斥实例 多线程获取同一变量

    C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多线程互斥实例 多线程获取同一变量"的示例中,我们将探讨如何在多个线程中安全地访问共享资源,避免数据不一致性和竞态条件。 首先...

    C#多线程刷新界面

    在C#编程中,多线程技术是一种关键的性能优化手段,特别是在处理耗时操作时,如后台数据处理、文件读写或者网络通信等。它可以让应用程序同时执行多个任务,提高程序的响应速度和用户体验。当涉及到用户界面(UI)...

    C#多线程编程实战.pdf

    C#多线程编程实战.pdf

    C#多线程进度条实例

    创建一个新的线程通常通过实例化`Thread`类并传递一个委托(或lambda表达式)作为参数,这个委托定义了新线程要执行的任务。例如: ```csharp Thread thread = new Thread(() =&gt; { // 这里放置要在线程中执行的...

    C#多线程消息处理例子

    总结来说,这个C#多线程消息处理例子展示了如何在后台线程中执行任务并安全地将结果传递给UI线程。它涉及到的关键技术包括线程创建、消息队列、事件与委托、以及线程安全的UI更新。理解并掌握这些概念对于编写高性能...

    C# 多线程界面假死解决,正确使用多线程

    C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 C# 多线程界面假死解决,正确使用多线程 没分的朋友...

    C#多线程执行

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地利用多核处理器资源,提高程序的运行效率。本篇文章将深入探讨C#中的多线程执行...

    C#多线程编程实战完整源码

    线程可以有自己的执行入口点,也可以通过参数化构造函数传递数据到线程函数。 2. **线程同步和互斥**:在多线程环境中,为了防止数据竞争和确保线程安全,我们需要使用同步机制。Mutex、Semaphore和Monitor是常用的...

Global site tag (gtag.js) - Google Analytics