如何跨线程调用winform窗体控件

mac2024-04-03  30

方法一:直接关闭异常,不检查跨线程调用

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

最新回复(0)