方法一:应用ParameterizedThreadStart这个委托来传递输入参数,这种方法适用于传递单个参数的情况。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. namespace BeginInvokeTest
  11. {
  12. /// <summary>
  13. /// 给线程传递参数
  14. /// </summary>
  15. public partial class Form1 : Form
  16. {
  17. public Form1()
  18. {
  19. InitializeComponent();
  20. }
  21. private void button1_Click(object sender, EventArgs e)
  22. {
  23. //第一种方法,应用ParameterizedThreadStart这个委托来传递输入参数
  24. ParameterizedThreadStart start = new ParameterizedThreadStart(ChangeText);
  25. Thread thread = new Thread(start);
  26. object obj = "HelloWorld";
  27. thread.Start(obj);
  28. }
  29. public delegate void ChangeTextDelegate(object message);
  30. public void ChangeText(object message)
  31. {
  32. //InvokeRequired是Control的一个属性(这个属性是可以在其他线程里访问的)
  33. //这个属性表明调用方是否来自非UI线程,如果是,则使用BeginInvoke来调用这个函数,否则就直接调用,省去线程封送的过程
  34. if (this.InvokeRequired)
  35. {
  36. this.BeginInvoke(new ChangeTextDelegate(ChangeText), message);
  37. }
  38. else
  39. {
  40. this.Text = message.ToString();
  41. }
  42. }
  43. }
  44. }

ParameterizedThreadStart 委托和 Thread.Start(Object) 方法重载使得将数据传递给线程过程变得简单,但由于可以将任何对象传递给 Thread.Start(Object),因此这种方法并不是类型安全的。将数据传递给线程过程的一个更可靠的方法是将线程过程和数据字段都放入辅助对 象。因此第一种方法是不推荐的。

方法二:利用线程实现类,将调用参数定义成属性的方式来操作线程参数,也就是将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。通过之种方法可以传递多个参数。

  1. using System;
  2. using System.Threading;
  3. // The ThreadWithState class contains the information needed for
  4. // a task, and the method that executes the task.
  5. //
  6. public class ThreadWithState {
  7. // State information used in the task.
  8. private string boilerplate;
  9. private int value;
  10. // The constructor obtains the state information.
  11. public ThreadWithState(string text, int number)
  12. {
  13. boilerplate = text;
  14. value = number;
  15. }
  16. // The thread procedure performs the task, such as formatting
  17. // and printing a document.
  18. public void ThreadProc()
  19. {
  20. Console.WriteLine(boilerplate, value);
  21. }
  22. }
  23. // Entry point for the example.
  24. //
  25. public class Example {
  26. public static void Main()
  27. {
  28. // Supply the state information required by the task.
  29. ThreadWithState tws = new ThreadWithState(
  30. "This report displays the number {0}.", 42);
  31. // Create a thread to execute the task, and then
  32. // start the thread.
  33. Thread t = new Thread(new ThreadStart(tws.ThreadProc));
  34. t.Start();
  35. Console.WriteLine("Main thread does some work, then waits.");
  36. t.Join();
  37. Console.WriteLine(
  38. "Independent task has completed; main thread ends.");
  39. }
  40. }

上面示例摘自MSDN

方法三:利用线程池来传递参数

方法四:利用匿名方法来传递参数,利用了匿名方法,连上面那种独立的类都省掉了,但是如果逻辑比较复杂,用这种方法就不太好了。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. namespace BeginInvokeTest
  11. {
  12. public partial class Form2 : Form
  13. {
  14. public Form2()
  15. {
  16. InitializeComponent();
  17. }
  18. private void button1_Click(object sender, EventArgs e)
  19. {
  20. Thread thread = new Thread(new ThreadStart(delegate()
  21. {
  22. this.BeginInvoke(new ChangeTextDelegate(ChangeText), "HelloWorld");
  23. }));
  24. thread.Start();
  25. }
  26. public delegate void ChangeTextDelegate(string message);
  27. public void ChangeText(string message)
  28. {
  29. this.Text = message;
  30. }
  31. }
  32. }

此外,如果需要从线程返回数据,这时可以用回调方法,下面示例摘自MSDN。

    1. using System;
    2. using System.Threading;
    3. // The ThreadWithState class contains the information needed for
    4. // a task, the method that executes the task, and a delegate
    5. // to call when the task is complete.
    6. //
    7. public class ThreadWithState {
    8. // State information used in the task.
    9. private string boilerplate;
    10. private int value;
    11. // Delegate used to execute the callback method when the
    12. // task is complete.
    13. private ExampleCallback callback;
    14. // The constructor obtains the state information and the
    15. // callback delegate.
    16. public ThreadWithState(string text, int number,
    17. ExampleCallback callbackDelegate)
    18. {
    19. boilerplate = text;
    20. value = number;
    21. callback = callbackDelegate;
    22. }
    23. // The thread procedure performs the task, such as
    24. // formatting and printing a document, and then invokes
    25. // the callback delegate with the number of lines printed.
    26. public void ThreadProc()
    27. {
    28. Console.WriteLine(boilerplate, value);
    29. if (callback != null)
    30. callback(1);
    31. }
    32. }
    33. // Delegate that defines the signature for the callback method.
    34. //
    35. public delegate void ExampleCallback(int lineCount);
    36. // Entry point for the example.
    37. //
    38. public class Example
    39. {
    40. public static void Main()
    41. {
    42. // Supply the state information required by the task.
    43. ThreadWithState tws = new ThreadWithState(
    44. "This report displays the number {0}.",
    45. 42,
    46. new ExampleCallback(ResultCallback)
    47. );
    48. Thread t = new Thread(new ThreadStart(tws.ThreadProc));
    49. t.Start();
    50. Console.WriteLine("Main thread does some work, then waits.");
    51. t.Join();
    52. Console.WriteLine(
    53. "Independent task has completed; main thread ends.");
    54. }
    55. // The callback method must match the signature of the
    56. // callback delegate.
    57. //
    58. public static void ResultCallback(int lineCount)
    59. {
    60. Console.WriteLine(
    61. "Independent task printed {0} lines.", lineCount);
    62. }
    63. }

Net线程足迹 传递参数至线程的更多相关文章

  1. C#传递参数到线程的n个方法

    [转]http://kb.cnblogs.com/a/888688/ 本片文章的议题是有关于传递参数到线程的几种方法. 首先我们要知道什么是线程,什么时候要用到线程,如何去使用线程,如何更好的利用线程 ...

  2. Jmeter 跨线程组传递参数 之两种方法

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  3. Jmeter 跨线程组传递参数 之两种方法(转)

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  4. Jmeter(五十二) - 从入门到精通高级篇 - jmeter之跨线程组传递参数(详解教程)

    1.简介 之前分享的所有文章都是只有一个线程组,而且参数的传递也只在一个线程组中,那么如果需要在两个线程组中传递参数,我们怎么做呢?宏哥今天就给小伙伴或者童鞋们讲解一下,如何实现在线程组之间传递参数. ...

  5. C++ 并发编程2 --向线程函数传递参数

    1向线程函数传递参数比较简单,一般的形式如下 void f(int i,std::string const& s);std::thread t(f,3, "hello"); ...

  6. Linux线程体传递参数的方法详解

    传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thre ...

  7. C#往线程里传递参数

    Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. Thread (ThreadStart) 初始化 Th ...

  8. Jmeter跨线程组传递参数

    Jmeter的线程组之间是相互独立的,各个线程组互不影响,所以线程组A中输出的参数,是无法直接在线程组B中被调用的. 但有时候为了方便,可以把不同模块接口放在不同线程组,就涉及不同线程组传参问题,比如 ...

  9. c#线程间传递参数

    线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函数(以下引自msdn).        Thread (P ...

随机推荐

  1. kali&BT安装好之后无法上网(包括Wifi)或者无法获得内网IP解决方法

    大家都知道,要想进行内网渗透攻击,你必须要在那个内网里.但是大家在Vmware里安装kali的时候,大多数用户为了方便,未选择桥接模式,而是选择了使用与本机共享的IP网络当然,这样能上网,但是你的虚拟 ...

  2. java中Property类的基本用法

    1 配置.properties文件 2 获取输入流的方法 1)FileInputStream fi = new FileInputStream(properties文件路径); 2)InputStre ...

  3. day3 作业

    文件操作用户很广泛,我们经常对文件进行操作: global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults ...

  4. layer弹出层的关闭问题

    就是在执行添加或修改的时候,需要将数据提交到后台进行处理,这时候添加成功之后最理想的状态是关闭弹出层并且刷新列表的数据信息,之前一直想实现这样,可一直没有成功,今天决定好好弄一弄,在仔细看过layer ...

  5. jquery 美化弹出提示 漂亮的Dialog 对话框

    三个不同的效果,分别是普通的警告,确认/取消,带一个输入框 本例用了jquery.alertify.js,请到演示页面查看 css文件也请到演示页面查看 JavaScript Code <scr ...

  6. thinkphp5.0配置作用域

    作用域 配置参数支持作用域的概念,默认情况下,所有参数都在同一个系统默认作用域下面.如果你的配置参数需要用于不同的项目或者相互隔离,那么就可以使用作用域功能,作用域的作用好比是配置参数的命名空间一样. ...

  7. Python数据类型-列表(list)增删改查

    1.添加元素 添加单个元素:使用append(object)函数可以为列表添加单个元素,参数object为对象:也就是说所有Python的对象都可以添加到列表中. 添加多个元素(合并列表):使用ext ...

  8. BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想

    emmmm我能怎么说呢 CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白... 因为这玩意的思想实在是太短了: fateice如是说道: 如果说对于一道题目的离线操作,假设有n个操作 ...

  9. spring杂碎

    spring优点 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦 ...

  10. PIPESTATUS(bash) + pipefail(ksh)

    I have two processes foo and bar, connected with a pipe: $ foo | bar bar always exits 0; I'm interes ...