c#线程中访问主窗体控件

本文详细介绍了在C#中如何解决子线程访问主线程控件的问题,通过使用委托和Invoke方法,确保了跨线程操作的正确性和线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做算法的移植和demo展示,算是把大学里的C++ C#又给复习了一遍。C#的窗体程序中,在子线程中访问主线程的控件,直接访问会引发异常,提示不在同一个进程里之类的错误。所以,在timer控件的定时事件或者在新线程里控制进度条这种任务都会涉及到子线程访问主线程里的控件问题。解决方案很简单,声明委托,然后在委托中判断是否在主线程中,不是就利用控件的Invoke方法。
大致流程:

  1. 声明委托
delegate void ShowProgressDelegate(int totalStep, int currentStep);
  1. 委托实现
  private void ShowProgress(int totalStep, int currentStep)
  {
      if(progressBar1.InvokeRequired == false)
      {
          progressBar1.Maximum = totalStep;
          progressBar1.Value = currentStep;
      }
      else
      {
          ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
          progressBar1.Invoke(showProgress, new object[] { totalStep, currentStep });
      }
      
  }
  1. 在需要的地方调用
private void Do()
{
  progress_thread = new System.Threading.Thread(new System.Threading.ThreadStart(TheadProcess));
  progress_thread.Start();
}

private void TheadProcess()
{            
    int seconds = (int)analyer_timer.Interval * 2;
    for (int i = 0; i<seconds; i+=seconds/200)
    {
        System.Threading.Thread.Sleep(100);
        ShowProgress(seconds, i+1);
    }
}

把这个移植完就可以继续玩我的python了,python用习惯了,写c居然会忘";",而且#include怎么看都是注释,重度python患者啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值