前言:線程間參數的傳遞經常用到,本文介紹線程間傳遞參數常用的幾種方式:
方式一:使用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~