zoukankan      html  css  js  c++  java
  • WinForm中Crossthread operation not valid错误的解决方法

    前一阵子写个小程序,画了一个Form,类名叫MainForm,程序里面还有一个TimerProcessor类,用于对System.Timers.Timer类的实例操作,由于Timer是在新线程中处理OnElapsed事件,而在处理这个事件的方法中,会对MainForm类的控件进行操作,于是,Debug运行时,就出现了如下错误:

    从Additional information来看,是因为在非Form的创建线程里访问了Form的控件,因此对控件的存取可能导致控件状态的不一致,所以Visual Studio调试时就抛出了这个异常。但是,如果以非Debug模式运行时,是不会有这个异常的,程序也会正常运行。由于程序不会一直运行在Debug模式,所以可以不管这个异常,但是为了健壮的代码,建议还是对其进行处理。


    解决方法:

    对需要操作Form中控件的地方,不再直接调用控件的相关设置方法,而是调用Form的Invoke()方法,将对控件进行设置的方法做成一个delegate传递给它,例子如下:

     

    // 下面是用于事件处理的方法,该方法和Form的创建线程不是同一
    // 个线程,所以直接在该方法中对Form的控件进行操作会出现异常
    // 解决方法如该方法所示,其中mainForm代表创建的Form对象
    private void OnElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    if (mainForm.InvokeRequired)
    {
    TrayIconUpdater updater
    = new TrayIconUpdater(UpdateTrayIconState);
    mainForm.Invoke(updater);
    }
    else
    {
    UpdateTrayIconState();
    }
    }

    // 一个在Form的Invoke()方法中要用到的delegate
    private delegate void TrayIconUpdater();

    // 真正的操作Form中控件的方法
    private void UpdateTrayIconState()
    {
    mainForm.TrayIcon.BalloonTipTitle
    = "Application Prompt";
    mainForm.TrayIcon.BalloonTipText
    = "This is a application tip.";
    mainForm.TrayIcon.ShowBalloonTip(
    5000);
    }

    这样,就算是在Debug模式也不会出现InvalidOperationException了。

    参考:http://msdn.microsoft.com/en-us/library/ms171728.aspx

  • 相关阅读:
    ASP.NET Core 中间件 中间件(Middleware)和过滤器(Filter)的区别
    ASP.NET Core 中间件详解及项目实战
    开源项目1:某大学校友管理系统
    web安全浅析
    p2p网贷平台设计简析
    一些常见的并且比较难解决的设计问题
    CentOS 新增swap交换空间
    策略模式
    Centos6.4 本地yum源配置
    Linux(CentOs6.4)安装Git
  • 原文地址:https://www.cnblogs.com/ini_always/p/2029409.html
Copyright © 2011-2022 走看看