zoukankan      html  css  js  c++  java
  • C# Winform使用线程改变窗体控件的属性

    Windows Forms控件通常不是thread-safe,因此.NET Framework为防止多个线程下对控件的存取可能导致控件状态的不一致,在调试时,CLR-Debugger会抛出一个InvalidOperationException以“建议”程序员程序可能存在的风险。当然你也可以忽略InvalidOperationException,在非调试的状态下,该异常并不会被抛出,CLR-Debugger监测对Handle的可能存在的不一致地存取,而期望达到更稳健的代码。处理这个问题有两种方法:第一,在某些情况下,我们并不需要这种“建议”,而这种建议将在调试时带来不必要的麻烦;第二,顺应“建议”,调整编程模型。

    解决方法: 

    1、在窗体的构造函数中加入或者在应用程序的Main中加入

    Control.CheckForIllegalCrossThreadCalls = false;

    从而忽略Cross-thread InvalidOperationException建议。 

    2、接受Cross-thread InvalidOperationException善意的建议,利用System.ComponentModel.ISynchronizeInvoke的InvokeRequired和Invoke方法,该代码对于大多数Windows控件有效,这样做的目的是保证由创建控件的Main Thread唯一性地呼叫get_Handle。  

    private void SafeSetText(string text)
    {
        if (this.InvokeRequired)
        {
            _SafeSetTextCall call = delegate(string s)
            {
                this.textBox1.Text = s;
            };

            this.Invoke(call, text);
        }
        else
            this.textBox1.Text = text;
    }

    private delegate void _SafeSetTextCall(string text); 

  • 相关阅读:
    php实现一个简单的四则运算计算器
    linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动
    mongodb
    随笔一个dom节点绑定事件
    php-fpm 启动参数及重要配置详解
    PHP的设计模式之工厂模式
    linux下mysql数据的导出和导入
    windows下mongodb安装与使用图文教程(整理)
    MySQL性能分析及explain的使用
    nginx反向代理缓存服务器的构建
  • 原文地址:https://www.cnblogs.com/sydeveloper/p/3060335.html
Copyright © 2011-2022 走看看