方法一:直接關閉異常,不檢查跨線程調用
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