C#線程傳遞參數的方式


前言:線程間參數的傳遞經常用到,本文介紹線程間傳遞參數常用的幾種方式:

方式一:使用ParameterizedThreadStart委托

示例如下:

using System;
using System.Threading;

namespace ConsoleLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ParameterizedThreadStart(SayHello));
            thread.Start("zhangsan");

            //簡寫
            //Thread thread = new Thread(SayHello);
            //thread.Start("zhangsan");

            Console.ReadKey();
        }

        public static void SayHello(object name)
        {
            if (!string.IsNullOrEmpty(name as string))
            {
                Console.WriteLine($"Hello! {name}");
            }
        }
    }
}

查看ParameterizedThreadStart底層如下:

    public delegate void ParameterizedThreadStart(object? obj);

可以看出ParameterizedThreadStart是底層自定義的一個只有一個object參數,無返回值的委托,所以傳遞方法的時候需要一個只有一個object參數,且返回類型為void的方法(委托實質就是同一種類型方法的抽象)

方法二:定義自定義類:

示例如下:

using System;
using System.Threading;

namespace ConsoleLearn
{
    public class MyThread
    {
        private string name;

        public MyThread(string name)
        {
            this.name = name;
        }

        public void SayHello()
        {
            Console.WriteLine($"Hello{name}");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //Thread thread = new Thread(new ParameterizedThreadStart(SayHello));
            //thread.Start("zhangsan");

            //簡寫
            //Thread thread = new Thread(SayHello);
            //thread.Start("zhangsan");
            MyThread myThread = new MyThread("zhangsan");

            Thread thread = new Thread(myThread.SayHello);
            thread.Start();

            Console.ReadKey();
        }

        public static void SayHello(object name)
        {
            if (!string.IsNullOrEmpty(name as string))
            {
                Console.WriteLine($"Hello! {name}");
            }
        }
    }


}

 可以看出,實質就是將參數封裝在一個類中,實例化的時候將參數傳遞進去

 方式三:Lambda表達式:

示例如下:

using System;
using System.Threading;

namespace ConsoleLearn
{
    public class MyThread
    {
        private string name;

        public MyThread(string name)
        {
            this.name = name;
        }

        public void SayHello()
        {
            Console.WriteLine($"Hello{name}");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //Thread thread = new Thread(new ParameterizedThreadStart(SayHello));
            //thread.Start("zhangsan");

            //簡寫
            //Thread thread = new Thread(SayHello);
            //thread.Start("zhangsan");
            //MyThread myThread = new MyThread("zhangsan");

            //Thread thread = new Thread(myThread.SayHello);
            //thread.Start();

            Thread thread = new Thread(()=>SayHello("zhangsan"));
            thread.Start();

            Console.ReadKey();
        }

        //public static void SayHello(object name)
        //{
        //    if (!string.IsNullOrEmpty(name as string))
        //    {
        //        Console.WriteLine($"Hello! {name}");
        //    }
        //}
        public static void SayHello(string name)
        {
            if (!string.IsNullOrEmpty(name as string))
            {
                Console.WriteLine($"Hello! {name}");
            }
        }
    }


}

以上就是線程間傳遞參數的三種方式,若有其他方式,歡迎補充交流,3Q~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM