如何跨線程調用winform窗體控件

方法一:直接關閉異常,不檢查跨線程調用

      private void Form1_Load(object sender, EventArgs e)
      {
      		// 在Load中加入下面這行代碼:不檢查跨線程的調用是否合法
            Control.CheckForIllegalCrossThreadCalls = false;
            
            Thread thread = new Thread(ThreadFuntion);
            thread.IsBackground = true;
            thread.Start();
        }

方法二:利用委託

舉例1、
delegate void TaskType( string szText );

// 這裏是因爲線程的方法只能是object類型
void TheradTask( object szText )
{
	// 這裏是判斷是不是主線程
	if( InvokeRequired == false ) {
		textBox1.Text = (string)szText;
		return;
	}
	
	// 如果不是主線程,那就直接做事
	TaskType task = new TaskType( ThreadTask );
	// Invoke這個方法帶參數必須是這個形式,和所在的TheradTask方法參數個數相同就行
	Invoke( task, new object[] { szText } );
}

void button1_Click( object sender, EventArgs e )
{
	Thread thread = new Thread( new ParameterizedThreadStart( ThreadTask ) );
	thread.Start( "test" );
}
舉例2,已經開線程了,所以傳入的參數類型不用是object類型
delegate void TaskType( string szMessage, string szName );
void chatAcceptSocket_ShowMessageEvent( string szMessage, string szName )
{
	// check is main thread
	if( InvokeRequired == false ) {
		string szShowMessage = "a";
		txtHistoryMessage.Text += szShowMessage;
		return;
	}

	TaskType task = new TaskType( chatAcceptSocket_ShowMessageEvent );
	Invoke( task, new object[] { szMessage, szName } );
}

更多可以參考:
https://www.cnblogs.com/darksoulson/p/3428577.html
https://www.cnblogs.com/zhaotiantang/archive/2009/03/17/1414135.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章