设为首页 加入收藏
首 页 企业简介 项目案例 软件定制 行业软件 解决方案 下载中心 服务专区 客服中心
服务项目
案例展示 更多 >>
·维修管理系统 2012-5-14
·园区游客服务管理系统 2012-5-10
·党风廉政信息公开平台 2012-5-10
·餐饮无线点菜系统 2012-1-11
·职工提案系统软件 2012-1-11
·电信客户资源管理系统软… 2012-1-11
·移动停电通知系统 2012-1-11
·洗衣收银软件 2012-1-11
·触摸查询系统软件 2012-1-11
·西安来电弹屏软件 2011-8-31
联系人:李先生
电  话:029-87878512
手  机:13468700578
地  址:西安市太白北路1号
在线咨询:  762176615
Email:junsoft@126.com
 
当前的位置 >> 返回首页 >> 解决方案
C# Winform使用线程改变窗体控件的属性
发布者:西安软件公司   发布时间:2017-9-4   阅读:2次

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


网站首页 | 关于我们 | 售后服务 | 网站地图 | 查看留言 | 在线留言 | 客服中心
© 版权所有:西安润宇软件科技有限公司 
公司地址:西安市太白北路1号 联系电话:029-87878512 手机:13468700578 联系人:李先生
Copyright ® 2009-2017 Xbwbw.com Inc. All Rights Reserved 
技术支持:西安润宇软件科技有限公司 陕ICP备 11000720号-2