先看微软如何给出的方法使用,如下查看,我们发现,如下两个委托,分别对应带参数创建线程 和 不带参数创建线程。


下列 委托 方法不带参数 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 委托的更多相关文章

  1. C# 多线程编程 ThreadStart ParameterizedThreadStart

    原文地址:http://club.topsage.com/thread-657023-1-1.html 在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运 ...

  2. ThreadStart和ParameterizedThreadStart区别

    ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数. ThreadStart threadStart=new Thre ...

  3. C# ThreadStart和ParameterizedThreadStart区别

    ThreadStart: ThreadStart这个委托定义为void ThreadStart(),也就是说,所执行的方法不能有参数.ThreadStart threadStart=new Threa ...

  4. C#中 ThreadStart和ParameterizedThreadStart区别

    最主要区别: 1.Thread 是启动一个线程,但是没有参数. 2.ParameterThreadStart  线程可以接受一个输入参数 ThreadStart: ThreadStart这个委托定义为 ...

  5. C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别

    C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye    { //私有的构造函数,保证外部不能实例化        private  ...

  6. ThreadStart 与ParameterizedThreadStart的区别

    1) ParameterizedThreadStart与ThreadStart 1 static void Main(string[] args) { #region ParameterizedThr ...

  7. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  8. C#多线程之基础篇1

    在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...

  9. 快速入门系列--CLR--02多线程

    最近,由于基础框架的整体升级,因此需要更新所有相关项目的DLL文件.这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出现异常的情况,很快的占用了大量的服务器内 ...

随机推荐

  1. leetcode187. Repeated DNA Sequences

    https://leetcode.com/problems/repeated-dna-sequences/#/description   https://leetcode.com/problems/r ...

  2. NSDictionary , NSMutableDictionary, NSMutableDictionary 和 NSMutableSet)相当于java的map、set

    1 NSDictionary 和 NSMutableDictionary NSDictionary  :就是java中的map; 放入对象是键值对 key-value  , 同样 秉持了一样的原则,只 ...

  3. 【MongoDB】windows下搭建Mongo主(Master)/从(slave)数据库同步

    在前面一系列的文章中.我们讲述了mongodb的基本操作,高级查询以及索引的使用. 该篇博客主要说明在windows系统怎样创建主从数据库同步: 须要启动两个mongoDb文档数据库,一个是主模式启动 ...

  4. Spring过滤器组件自动扫描

    在这个Spring自动组件扫描的教程,您已经了解如何使Spring自动扫描您的组件.在这篇文章中,我们将展示如何使用组件过滤器自动扫描过程. 1.过滤组件 - 包含 参见下面的例子中使用Spring  ...

  5. g++ 链接*.a静态库 方法

    g++在链接*.a静态库时,直接作为object使用,不需要使用-l ,但是需要注意调整顺序,被依赖的文件放在后面. 如: g++  -g  -o0 -Wno-deprecated  -I$(INCL ...

  6. C++ Tr1中的正則表達式

    要使用正則表達式,首先要有类库支持,C++曾经不像Java或者C#有完整的类库使用,可是在Tr1中早已提供了正则库,仅仅是非常少被人们注意罢了 TR1中包括了一个正则库,来自Boost的 regex, ...

  7. 学习笔记 ST算法

    [引子]RMQ (Range Minimum/Maximum Query)问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值 ...

  8. go语言基础之工程管理和工作区介绍

    1.工程管理 在实际的开发工作中,直接调用编译器进行编译和链接的场景是少而又少,因为在工程中不会简单到只有一个源代码文件,且源文件之间会有相互的依赖关系.如果这样一个文件一个文件逐步编译,那不亚于一场 ...

  9. JSP学习笔记(一):JSP语法和指令

    一.语法 1.脚本程序的语法格式: 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. <% 代码片段 %> 2.中文编码问题 如果我们要在页面正常显 ...

  10. ZeroClipboard及其原理介绍

    系列教程地址:http://www.365mini.com/page/zeroclipboard-2_x-quick-start.htm ZeroClipboard 是国外大神开发的一个用于剪贴板复制 ...