C#应用 - 如何跨线程调用窗体控件
1、新建工程后。需要新建线程,在线程中调用控件,此处在线程中打印信息。按照需求,添加如下控件。

2、添加基本代码:
“新建线程”:thread1 = new Thread(Task_Thread);thread1.Start();开启线程。
“关闭线程”:thread1.Abort();
“线程任务”:
while (Thread.CurrentThread.ThreadState != ThreadState.Aborted)
{
RecordInfo("当前线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString()+ "状态:"+ Thread.CurrentThread.IsAlive.ToString());
Thread.Sleep(1000);
}


3、如图出现“线程间操作无效”报警

1、在窗体初始化中添加
Control.CheckForIllegalCrossThreadCalls = false;
不检查线程间调用异常。同样无法检测其他线程调用异常,不推荐!

2、此处示例较为简单,结果显示正确。

1、全部代码如下,基本框架没变,只是在调用控件时做了处理


2、在调用函数中设置
if (textBox1.InvokeRequired)
{
// 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
Action<string> actionDelegate = (x) => { this.textBox1.AppendText(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff \r\n") + x.ToString() + "\r\n"); };
this.textBox1.Invoke(actionDelegate, info);
}
主线程外的其他线程要调用时,触发InvokeRequired,即可通过Invoke,完成设置的委托。

1、方案3相比方案2只是将invoke改为begininvoke。

2、Invoke 与begininvoke区别在于是否阻塞调用线程。
invoke:会阻塞当前线程,直到invoke调用结束(委托方法执行结束),才继续执行(同步调用)。
begininvoke:不会阻塞当前线程,只将调用方法封送完毕就返回,不会阻塞调用者线程(异步调用)。

1、添加 BackgroundWorker 组件后,设置属性。



2、图实例:
RunWorkerAsync() 开启辅助线程
CancelAsync();关闭辅助线程(属性中要允许关闭)
backgroundWorker1_DoWork()开启辅助线程后,进入DoWork中
ReportProgress();在辅助线程中改变的量可通过此接口传输
backgroundWorker1_RunWorkerCompleted();辅助线程结束时触发
backgroundWorker1_ProgressChanged();改变ReportProgress时触发
ProgressPercentage/UserState为ReportProgress()中改变的量


3、显示效果如图
