[C#.NET] 如何 使用 多執行緒 Thread / 跨執行緒 存取UI

http://www.dotblogs.com.tw/yc421206/archive/2009/02/13/7141.aspx

System.Threading 命名空間提供了執行緒的建立,讓開發者省去了不少程式碼。

使用多執行緒時先匯入System.Threading

如何建立執行緒

1.建立一個方法

private void RunSample01()
{
  Console.WriteLine("執行緒:{0}",Thread.CurrentThread.ManagedThreadId);
}


 

 

2.建立ThreadStart委派,它是用來表示在執行緒上執行的方法。

ThreadStart myRun = new ThreadStart(RunSample01);

 

 

3.建立Thread 類別,它是用來建立和控制執行緒,設定執行緒的優先權,並取得它的狀態。

Thread myThread = new Thread(myRun);

4.啟動執行緒

myThread.Start();

 

如何建立多重執行緒

private void button2_Click(object sender, EventArgs e)
{
	//1.建立ThreadStart委派
	ThreadStart myRun = new ThreadStart(RunSample01);
	for (int i = 0; i < 6; i++)
	{
		try
		{
			//2.建立Thread 類別
			Thread myThread = new Thread(myRun);
			//3.啟動執行緒
			myThread.Start();
		}
		catch (Exception)
		{
			//例外發生則終止迴圈執行
			break;
		}
	}
		 
}

如何傳遞參數給多執行緒

ThreadStart委派沒有傳遞參數的功能,在實際應用上我們常需要傳遞參數,這時就要改用ParameterizedThreadStart 委派ParameterizedThreadStart 委派用法與ThreadStart委派大同小異,只是多了參數傳遞機制。


private void button3_Click(object sender, EventArgs e)
{
		//1.建立ParameterizedThreadStart委派
		ParameterizedThreadStart myPar = new ParameterizedThreadStart(RunSample02);
		//2.建立Thread 類別
		Thread myThread01 = new Thread(myPar);
		Thread myThread02 = new Thread(myPar);
		//3.啟動執行緒並帶入參數
		myThread01.Start("我是多執行緒第一號");
		myThread02.Start("我是多執行緒第二號");
}        
private void RunSample02(object o)
{
	string myStr = o as string;
	//string myStr = (string)o;
	if (myStr == null)
	{
		myStr = (string)o;
	}
	else
	{
		for (int i = 0; i < 6; i++)
		{
			Console.WriteLine("{0}:{1}", myStr, Thread.CurrentThread.ManagedThreadId);
			Thread.Sleep(1000);
		}
	}
}

如何跨執行緒存取UI

當我試著用WinFrom寫多執行緒時,卻出現了以下錯誤訊息

跨執行緒作業無效: 存取控制項 'textBox1' 時所使用的執行緒與建立控制項的執行緒不同。

詢問高手後有三種方法解決:

1.Form.CheckForIllegalCrossThreadCalls = False

2.建立委派

3.使用BackgroundWorker


第一種方法,據說不安全,但我也不曉得哪裡不安全,但用起來還蠻方便的。

第二種方法,比較正統使用委派的方式,若爾後需要改任何控制項的文字時(需有text屬性的),呼叫 myU即可。

private delegate void myUICallBack(string myStr, Control ctl);
private void myUI(string myStr, Control ctl)
{
	if (this.InvokeRequired)
	{
		myUICallBack myUpdate = new myUICallBack(myUI);
		this.Invoke(myUpdate, myStr, ctl);
	}
	else
	{
		ctl.Text = myStr;
	}
}
第三種方法,使用 BackgroundWorker ,更強大的功能讓我們省去了上述繁雜的動作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值