方法一:应用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. 使用CLion

    CLion是JetBrains公司的一款C++的IDE.默认使用Cmake构建. ubuntu和fedora下的安装 在ubuntu下安装了CLion,和QtCreator相比: ibus输入法能输入 ...

  2. day1 作业二:多级菜单操作

    作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入b返回上一层,输入q退出整个程序 思路:三级菜单第一级别是省,第二级别是市,第三级别是县,用户 ...

  3. PHP原理之变量

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/08/22/412.html 转载请注明出处 或许你知道,或许你不知道,PHP是一个弱类型,动 ...

  4. ref:PHP代码注入审计

    ref:https://www.waitalone.cn/php-code-injection.html 通俗易懂,全面清晰. 0x1 前言 为了方便自己以后的翻阅和查找,最近正在整理一些所学的内容. ...

  5. 在SpringMVC Controller中注入Request成员域

    主题 在工作中遇到1个问题....我们定义了一个Controller基类,所有Springmvc自定义的controller都继承它....在它内部定义一个@Autowired HttpServlet ...

  6. 【UOJ 79】 一般图最大匹配 (✿带花树开花)

    从前一个和谐的班级,所有人都是搞OI的.有 n 个是男生,有 0 个是女生.男生编号分别为 1,…,n. 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个人负责吐槽.每个人至多属于 ...

  7. 比较IBM MQSeries和BEA WebLogic JMS Server(转载)

    在面向消息的中间件(MOM)这个领域,IBM MQSeries (又称WebSphere MQ)一直是当仁不让的超级大哥,其它还有一些小兄弟,比如SwiftMQ.SonicMQ之类.但近年来随着J2E ...

  8. 【51Nod 1756】【算法马拉松 23】谷歌的恐龙

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1765 设答案为\(X\). 则\[X=\frac{m}{n}\times ...

  9. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  10. Codeforces 196 E. Tricky and Cleve Password

    \(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...