C#多執行緒委託ParameterizedThreadStart應用
阿新 • • 發佈:2020-12-15
如果需要檢視更多文章,請微信搜尋公眾號csharp程式設計大全,需要進C#交流群群請加微信z438679770,備註進群, 我邀請你進群! ! !
C#使用執行緒時首先需要建立執行緒,使用Thread類建構函式建立例項需要用到ThreadStart委託或者ParameterizedThreadStart 委託建立 Thread 類的例項,ThreadStart 委託只能用於無返回值、無引數的方法,ParameterizedThreadStart 委託則可以用於帶引數的方法。執行緒不會直接執行,直至呼叫Start()方法時為止。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace threadCtrTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //帶引數的執行緒函式,引數必須為object型別 public void txtShow(object name) { richTextBox1.Text = Convert.ToString(name);//可以根據需要轉換型別 } private void button1_Click(object sender, EventArgs e) { //這一屬性設定為false,則可以非安全的跨執行緒操作UI控制元件。 // Control.CheckForIllegalCrossThreadCalls = false; //例項化一個執行緒,該執行緒的代理指向一個帶引數的執行緒函式 Thread myt = new Thread(new ParameterizedThreadStart(txtShow)); //這裡傳入object型別引數 myt.Start("jamT"); } } }
加上這句就好了:
Control.CheckForIllegalCrossThreadCalls = false;
不過這種方式指標不治本
方法2:將空間內容作為一個物件進行傳遞
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; namespace threadCtrTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //帶引數的執行緒函式,引數必須為object型別 public void txtShow(object obj) { string c = (string)obj; MessageBox.Show(c); } private void button1_Click(object sender, EventArgs e) { //這一屬性設定為false,則可以非安全的跨執行緒操作UI控制元件。 // Control.CheckForIllegalCrossThreadCalls = false; //例項化一個執行緒,該執行緒的代理指向一個帶引數的執行緒函式 Thread myt = new Thread(new ParameterizedThreadStart(txtShow)); //這裡傳入object型別引數 myt.Start(richTextBox1.Text); } } }
REMARK:
Thread myt = new Thread(new ParameterizedThreadStart(txtShow));
也可以減簡寫成
Thread myt = new Thread(txtShow);
執行效果:
拓展內容: C#中 ThreadStart和ParameterizedThreadStart區別 最主要區別: 1.Thread 是啟動一個執行緒,但是沒有引數。 2.ParameterThreadStart 執行緒可以接受一個輸入引數 ThreadStart: ThreadStart這個委託定義為void ThreadStart(),也就是說,所執行的方法不能有引數。 ThreadStart threadStart=new ThreadStart(ProcessData); Thread thread=new Thread(threadStart); thread.Start(); public void SayHelloToXiaohouye() { string strName="My name is Xiaohouye"; Console.Write("Hello "+strName); } 上面很簡單的例子,我們用定義了一個ThreadStart型別的委託,這個委託制定了執行緒需要執行的方法: SayHelloToXiaohouye,在這個方法裡宣告一個變數,並輸出.這就構成了最簡單的多執行緒的例子,一般情況下,我們都是用這個的。 ParameterThreadStart: ParameterThreadStart的定義為void ParameterizedThreadStart(object state),使用這個這個委託定義的執行緒的啟動函式可以接受一個輸入引數,具體例子如下 : ParameterizedThreadStart threadStart=new ParameterizedThreadStart(SayHelloToXiaohouye) Thread thread=new Thread() ; thread.Start("Xiaohouye"); //注意引數一定要用object 型別,否則報錯 public void SayHelloToXiaohouye(object name) { //使用時候需要轉換 Console.Write("Hello my name is {0}",name.ToString()); } 看了一個引數的例子,下面我們來看下多個引數的例子 ,我們通過把多個引數組合到一個類中,然後把這個類的例項作為引數傳遞,就可以實現多個引數傳遞,廢話不多說,看程式碼: public class AddParameter { public string a=string.Empty; public string b=string.Empty; public AddParameter(string name1, string name2) { a = name1; b = name2; } } #endregion class Program { static void Main(string[] args) { Console.WriteLine("***** Adding with Thread objects *****"); Console.WriteLine("當前執行緒為:{0}", Thread.CurrentThread.ManagedThreadId); AddParameter p = new AddParameter("xiaohouye", "xiaowangzi"); Thread t = new Thread(new ParameterizedThreadStart(Add)); t.Start(p); Console.ReadLine(); } #region Add method //組合引數 static void Add(object data) { if (data is AddParams) { Console.WriteLine("當前執行緒為:{0}",Thread.CurrentThread.ManagedThreadId); AddParameter ap = (AddParameter )data; Console.WriteLine("{0} + {1} is {2}", ap.a, ap.b, ap.a + ap.b); } } #endregion } }