多线程之 ThreadStart 和 ParameterizedThreadStart 委托
先看微软如何给出的方法使用,如下查看,我们发现,如下两个委托,分别对应带参数创建线程 和 不带参数创建线程。
下列 委托 方法不带参数 ThreadStart namespace System.Threading
{
// 摘要:
// 表示在 System.Threading.Thread 上执行的方法。
[ComVisible(true)]
public delegate void ThreadStart();
}
//ParameterizedThreadStart 带参数,参数为 object 类型,这就要求我们写的 函数(被委托的),输入参数是object
namespace System.Threading
{
// 摘要:
// 表示在 System.Threading.Thread 上执行的方法。
//
// 参数:
// obj:
// 包含该线程过程的数据的对象。
[ComVisible(false)]
public delegate void ParameterizedThreadStart(object obj);
}
如下,我们可以先定义一个简单的ShowMessage()方法,不带参数。
{
public class Message
{
public void ShowMessage()
{
string message = string.Format("Async threadId is :{0}",
Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(message);
for (int n = ; n < ; n++)
{
Thread.Sleep();
Console.WriteLine("The number is:" + n.ToString());
Console.WriteLine("OK!");
}
}
}
//主函数调用时
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main threadId is:" +
Thread.CurrentThread.ManagedThreadId);
Message message = new Message();
//Thread thread = new Thread(message.ShowMessage); //委托绑定 ShowMessage()方法, 下列是通过 ThreadStart 委托绑定, 为什么这么写,后面有介绍
Thread thread = new Thread(new ThreadStart(message.ShowMessage)); //通过ThreadStart委托绑定Message对象的ShowMessage()方法,该句
thread.Start(); //Start() 启动的线程默认在前台执行
//thread.IsBackground = true; //将线程放到后台,这时应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行
Console.WriteLine("Do something ..........!");
Console.WriteLine("Main thread working is complete!");
}
}
}
同样我们可以利用 ParameterizedThreadStart 创建带参数的线程。
public class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
}
public class Message
{
public void ShowMessage(object person)
{
if (person != null)
{
Person _person = (Person)person;
string message = string.Format("\n{0}'s age is {1}!\nAsync threadId is:{2}",
_person.Name, _person.Age, Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(message);
}
for (int n = ; n < ; n++)
{
Thread.Sleep();
Console.WriteLine("The number is:" + n.ToString());
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main threadId is:" + Thread.CurrentThread.ManagedThreadId);
Message message = new Message();
//绑定带参数的异步方法
Thread thread = new Thread(new ParameterizedThreadStart(message.ShowMessage));
//Thread thread2 = new Thread((message.ShowMessage));
Person person = new Person();
person.Name = "Jack";
person.Age = ;
thread.Start(person); //启动异步线程
Console.WriteLine("Do something ..........!");
Console.WriteLine("Main thread working is complete!");
//Thread.Sleep(100000);
thread.Join();
}
}
如上的都能实现如下图的结果:

添加,Thread.Sleep(5000);此时应用程序域将在主线程运行5秒后自动结束
为什么我们可以用 Thread()直接调用方法呢,我们按F12查看 Thread() 微软给出的定义。
如下,Thread 的方法重载,就是调用的 有参数的 和 无参数的 委托

谢谢阅读!分享共进步!
多线程之 ThreadStart 和 ParameterizedThreadStart 委托的更多相关文章
- C# 多线程编程 ThreadStart ParameterizedThreadStart
原文地址:http://club.topsage.com/thread-657023-1-1.html 在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运 ...
- ThreadStart和ParameterizedThreadStart区别
ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数. ThreadStart threadStart=new Thre ...
- C# ThreadStart和ParameterizedThreadStart区别
ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数.ThreadStart threadStart=new Threa ...
- C#中 ThreadStart和ParameterizedThreadStart区别
最主要区别: 1.Thread 是启动一个线程,但是没有参数. 2.ParameterThreadStart 线程可以接受一个输入参数 ThreadStart: ThreadStart这个委托定义为 ...
- C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别
C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye { //私有的构造函数,保证外部不能实例化 private ...
- ThreadStart 与ParameterizedThreadStart的区别
1) ParameterizedThreadStart与ThreadStart 1 static void Main(string[] args) { #region ParameterizedThr ...
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
- C#多线程之基础篇1
在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...
- 快速入门系列--CLR--02多线程
最近,由于基础框架的整体升级,因此需要更新所有相关项目的DLL文件.这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出现异常的情况,很快的占用了大量的服务器内 ...
随机推荐
- April Fools Day Contest 2016 A. Da Vinci Powers
A. Da Vinci Powers 题目连接: http://www.codeforces.com/contest/656/problem/A Description The input conta ...
- SpringMVC 3.1.1版本下的单元测试WEB-INF路径问题
假设Spring配置文件为applicationContext.xml 一.Spring配置文件在类路径下面 在Spring的java应用程序中,一般我们的Spring的配置文件都是放在放在类路径下面 ...
- 最新iOS砸壳方式Frida (Mac OSX)
1. 安装Frida 首先需要安装Python3,我下载的是 macOS 64-bit installer 安装,因Macbook本机自带python为2.7.x,故需要配置~/.bash_profi ...
- SQL Server 2008 Windows身份验证改为混合模式身份验证 及修改sa密码
由于需要,要把SQL2008单一的Windows身份验证改为混合模式身份验证.在此做一备忘. 步骤: 1.用Windows身份验证方式进入SQL2008,在[对象资源管理器]右键击[根目录]:
- JSoup 用法详解
清单 1 // 直接从字符串中输入 HTML 文档 String html = "<html><head><title> 开源中国社区 </titl ...
- switch语句的基本使用
switch是一个多分支的选择语句. 1.基本格式: switch(整型表达式){ case 整型字面量: ...... default : } 解释: 1)整型字面量可 ...
- C++UI框架
WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得 ...
- 第十一章 PhpMyAdmin连接远程mysql服务器---连接openwrt 703N服务器
//千万不要在你原来的那个phpmyadmin文件夹上操作~~~要复制一个新的进行操作,这样我们就可以同时使用本地和远程 一.下载phpmyadmin到本地 我使用的是windows下的集成WAM ...
- mac活动监视器 的含义
应用内存:应用所使用的内存数量. 联动内存:系统运行需要的内存.联动内存不能缓存且必须存放在内存中,所以不能被其他应用使用. 压缩:为腾出更多内存而压缩的内存数量.当电脑接近其最大内存能力时,内存中的 ...
- SASS详解之编译输出的样式
SASS是一种CSS预处理语言,没有装环境的话是不能被解析的.但是有了koala编译工具之后,解析SASS不需要环境也毫无压力了.SASS的输出格式有四种:嵌套.扩大.紧凑和压缩.下面结合小例子为大家 ...