Net线程足迹 传递参数至线程
方法一:应用ParameterizedThreadStart这个委托来传递输入参数,这种方法适用于传递单个参数的情况。
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace BeginInvokeTest
- {
- /// <summary>
- /// 给线程传递参数
- /// </summary>
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- //第一种方法,应用ParameterizedThreadStart这个委托来传递输入参数
- ParameterizedThreadStart start = new ParameterizedThreadStart(ChangeText);
- Thread thread = new Thread(start);
- object obj = "HelloWorld";
- thread.Start(obj);
- }
- public delegate void ChangeTextDelegate(object message);
- public void ChangeText(object message)
- {
- //InvokeRequired是Control的一个属性(这个属性是可以在其他线程里访问的)
- //这个属性表明调用方是否来自非UI线程,如果是,则使用BeginInvoke来调用这个函数,否则就直接调用,省去线程封送的过程
- if (this.InvokeRequired)
- {
- this.BeginInvoke(new ChangeTextDelegate(ChangeText), message);
- }
- else
- {
- this.Text = message.ToString();
- }
- }
- }
- }
ParameterizedThreadStart 委托和 Thread.Start(Object) 方法重载使得将数据传递给线程过程变得简单,但由于可以将任何对象传递给 Thread.Start(Object),因此这种方法并不是类型安全的。将数据传递给线程过程的一个更可靠的方法是将线程过程和数据字段都放入辅助对 象。因此第一种方法是不推荐的。
方法二:利用线程实现类,将调用参数定义成属性的方式来操作线程参数,也就是将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数。通过之种方法可以传递多个参数。
- using System;
- using System.Threading;
- // The ThreadWithState class contains the information needed for
- // a task, and the method that executes the task.
- //
- public class ThreadWithState {
- // State information used in the task.
- private string boilerplate;
- private int value;
- // The constructor obtains the state information.
- public ThreadWithState(string text, int number)
- {
- boilerplate = text;
- value = number;
- }
- // The thread procedure performs the task, such as formatting
- // and printing a document.
- public void ThreadProc()
- {
- Console.WriteLine(boilerplate, value);
- }
- }
- // Entry point for the example.
- //
- public class Example {
- public static void Main()
- {
- // Supply the state information required by the task.
- ThreadWithState tws = new ThreadWithState(
- "This report displays the number {0}.", 42);
- // Create a thread to execute the task, and then
- // start the thread.
- Thread t = new Thread(new ThreadStart(tws.ThreadProc));
- t.Start();
- Console.WriteLine("Main thread does some work, then waits.");
- t.Join();
- Console.WriteLine(
- "Independent task has completed; main thread ends.");
- }
- }
上面示例摘自MSDN
方法三:利用线程池来传递参数
方法四:利用匿名方法来传递参数,利用了匿名方法,连上面那种独立的类都省掉了,但是如果逻辑比较复杂,用这种方法就不太好了。
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace BeginInvokeTest
- {
- public partial class Form2 : Form
- {
- public Form2()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- Thread thread = new Thread(new ThreadStart(delegate()
- {
- this.BeginInvoke(new ChangeTextDelegate(ChangeText), "HelloWorld");
- }));
- thread.Start();
- }
- public delegate void ChangeTextDelegate(string message);
- public void ChangeText(string message)
- {
- this.Text = message;
- }
- }
- }
此外,如果需要从线程返回数据,这时可以用回调方法,下面示例摘自MSDN。
- using System;
- using System.Threading;
- // The ThreadWithState class contains the information needed for
- // a task, the method that executes the task, and a delegate
- // to call when the task is complete.
- //
- public class ThreadWithState {
- // State information used in the task.
- private string boilerplate;
- private int value;
- // Delegate used to execute the callback method when the
- // task is complete.
- private ExampleCallback callback;
- // The constructor obtains the state information and the
- // callback delegate.
- public ThreadWithState(string text, int number,
- ExampleCallback callbackDelegate)
- {
- boilerplate = text;
- value = number;
- callback = callbackDelegate;
- }
- // The thread procedure performs the task, such as
- // formatting and printing a document, and then invokes
- // the callback delegate with the number of lines printed.
- public void ThreadProc()
- {
- Console.WriteLine(boilerplate, value);
- if (callback != null)
- callback(1);
- }
- }
- // Delegate that defines the signature for the callback method.
- //
- public delegate void ExampleCallback(int lineCount);
- // Entry point for the example.
- //
- public class Example
- {
- public static void Main()
- {
- // Supply the state information required by the task.
- ThreadWithState tws = new ThreadWithState(
- "This report displays the number {0}.",
- 42,
- new ExampleCallback(ResultCallback)
- );
- Thread t = new Thread(new ThreadStart(tws.ThreadProc));
- t.Start();
- Console.WriteLine("Main thread does some work, then waits.");
- t.Join();
- Console.WriteLine(
- "Independent task has completed; main thread ends.");
- }
- // The callback method must match the signature of the
- // callback delegate.
- //
- public static void ResultCallback(int lineCount)
- {
- Console.WriteLine(
- "Independent task printed {0} lines.", lineCount);
- }
- }
Net线程足迹 传递参数至线程的更多相关文章
- C#传递参数到线程的n个方法
[转]http://kb.cnblogs.com/a/888688/ 本片文章的议题是有关于传递参数到线程的几种方法. 首先我们要知道什么是线程,什么时候要用到线程,如何去使用线程,如何更好的利用线程 ...
- Jmeter 跨线程组传递参数 之两种方法
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- Jmeter 跨线程组传递参数 之两种方法(转)
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- Jmeter(五十二) - 从入门到精通高级篇 - jmeter之跨线程组传递参数(详解教程)
1.简介 之前分享的所有文章都是只有一个线程组,而且参数的传递也只在一个线程组中,那么如果需要在两个线程组中传递参数,我们怎么做呢?宏哥今天就给小伙伴或者童鞋们讲解一下,如何实现在线程组之间传递参数. ...
- C++ 并发编程2 --向线程函数传递参数
1向线程函数传递参数比较简单,一般的形式如下 void f(int i,std::string const& s);std::thread t(f,3, "hello"); ...
- Linux线程体传递参数的方法详解
传递参数的两种方法 线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数. 例子 #include #include using namespace std; pthread_t thre ...
- C#往线程里传递参数
Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. Thread (ThreadStart) 初始化 Th ...
- Jmeter跨线程组传递参数
Jmeter的线程组之间是相互独立的,各个线程组互不影响,所以线程组A中输出的参数,是无法直接在线程组B中被调用的. 但有时候为了方便,可以把不同模块接口放在不同线程组,就涉及不同线程组传参问题,比如 ...
- c#线程间传递参数
线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函数(以下引自msdn). Thread (P ...
随机推荐
- js自动检索输入文章长度
1. 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- js基础练习(四)
练习: 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角.试编程. 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- Hadoop案例(九)流量汇总案例
流量汇总程序案例 1.自定义输出 统计手机号耗费的总上行流量.下行流量.总流量(序列化) 1)需求: 统计每一个手机号耗费的总上行流量.下行流量.总流量 2)数据准备 phone_date.txt - ...
- Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)
辅助排序和二次排序案例(GroupingComparator) 1.需求 有如下订单数据 订单id 商品id 成交金额 0000001 Pdt_01 222.8 0000001 Pdt_05 25.8 ...
- ubuntu sublime text 3 build 3083 license
经验证:sublime text 3 3083可用 ----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855605813A03D ...
- 十四 oracle 视图
一.介绍视图是一张虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视 ...
- 三十三 StringIO和BytesIO
StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文 ...
- MVC开发人员必备的五大工具
1. Chirpy Zippy 下载地址:http://chirpy.codeplex.com/ 过去,在将JavaScript脚本和CSS文件部署到Web服务器之 前,我习惯使用压缩工具进行压缩再部 ...
- BZOJ4327 [JSOI2012] 玄武密码 [AC自动机]
题目传送门 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...
- 洛谷P1404 平均数 [01分数规划,二分答案]
题目传送门 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...