1. 程式人生 > 實用技巧 >C#多執行緒委託ParameterizedThreadStart應用

C#多執行緒委託ParameterizedThreadStart應用

如果需要檢視更多文章,請微信搜尋公眾號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
}
}