C#应用 - 如何跨线程调用窗体控件

2025-12-18 20:27:13

1、新建工程后。需要新建线程,在线程中调用控件,此处在线程中打印信息。按照需求,添加如下控件。

C#应用 - 如何跨线程调用窗体控件

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);

            }  

C#应用 - 如何跨线程调用窗体控件

C#应用 - 如何跨线程调用窗体控件

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

C#应用 - 如何跨线程调用窗体控件

1、在窗体初始化中添加

Control.CheckForIllegalCrossThreadCalls = false;

不检查线程间调用异常。同样无法检测其他线程调用异常,不推荐!

C#应用 - 如何跨线程调用窗体控件

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

C#应用 - 如何跨线程调用窗体控件

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

C#应用 - 如何跨线程调用窗体控件

C#应用 - 如何跨线程调用窗体控件

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,完成设置的委托。

C#应用 - 如何跨线程调用窗体控件

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

C#应用 - 如何跨线程调用窗体控件

2、Invoke 与begininvoke区别在于是否阻塞调用线程。

invoke:会阻塞当前线程,直到invoke调用结束(委托方法执行结束),才继续执行(同步调用)。

begininvoke:不会阻塞当前线程,只将调用方法封送完毕就返回,不会阻塞调用者线程(异步调用)。

C#应用 - 如何跨线程调用窗体控件

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

C#应用 - 如何跨线程调用窗体控件

C#应用 - 如何跨线程调用窗体控件

C#应用 - 如何跨线程调用窗体控件

2、图实例:

RunWorkerAsync() 开启辅助线程

CancelAsync();关闭辅助线程(属性中要允许关闭)

backgroundWorker1_DoWork()开启辅助线程后,进入DoWork中

ReportProgress();在辅助线程中改变的量可通过此接口传输

backgroundWorker1_RunWorkerCompleted();辅助线程结束时触发

backgroundWorker1_ProgressChanged();改变ReportProgress时触发

ProgressPercentage/UserState为ReportProgress()中改变的量

C#应用 - 如何跨线程调用窗体控件

C#应用 - 如何跨线程调用窗体控件

3、显示效果如图

C#应用 - 如何跨线程调用窗体控件

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢