方法一:应用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. hdu 5877(树状数组+dfs)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. AC日记——小A和uim之大逃离 II 洛谷七月月赛

    小A和uim之大逃离 II 思路: spfa: 代码: #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f ...

  3. ServiceWorker pwa缓存

    index.js if ( navigator.serviceWorker ) { console.log("cache index") window.addEventListen ...

  4. HttpServletRequest继承字ServletRequest的常用方法

    //获取请求的完整路径String origUrl = req.getRequestURL().toString(); //获取查询的参数String queryStr = req.getQueryS ...

  5. Http 请求 GET和POST的区别

    GET和POST还有一个重大区别,简单的说: GET产生一个TCP数据包;POST产生两个TCP数据包. 长的说: 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器 ...

  6. 【转】django 与 vue 的完美结合 实现前后端的分离开发之后在整合

    https://blog.csdn.net/guan__ye/article/details/80451318   最近接到一个任务,就是用django后端,前段用vue,做一个普通的简单系统,我就是 ...

  7. Django+Nginx+uwsgi搭建自己的博客(一)

    最近对写爬虫有些厌倦了,于是将方向转移到了Web开发上.其实在之前自己也看过一部分Flask的资料,但总觉得Flask的资料有些零散,而且需要的各种扩展也非常多.因此,我将研究方向转移到了另一个主流的 ...

  8. Linux-数据库3

    外键约束 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表. 外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操 ...

  9. React Native 系列(二)

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  10. 【UOJ 117】欧拉回路

    #117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...