多线程之 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 = 0; n < 10; n++)

            {

                Thread.Sleep(300);

                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 = 0; n < 10; n++)

            {

                Thread.Sleep(3000);

                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 = 21;

            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 的方法重载,就是调用的 有参数的 和 无参数的 委托

谢谢阅读!分享共进步!

原文地址:https://www.cnblogs.com/imyao/p/5316844.html