UI操作BackgroundWorker与Thread

本文介绍了如何使用BackgroundWorker和Thread解决界面响应迟钝的问题。通过示例代码展示了两种方法的具体实现,以及如何处理线程间操作控件的问题,避免因非法跨线程调用而产生的异常。
当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程
//使用BackgroundWorker控件
public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }
        void test()
        {

            String[] s = { "111", "222" };
            for (int i = 0; i < s.Length; i++)
            {
                comboBox1.Items.Add(s[i]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
            backgroundWorker1.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            test();
        }
    }

//使用Thread
public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            //CheckForIllegalCrossThreadCalls = false;
            //不使用CheckForIllegalCrossThreadCalls线程间操作控件就要使用委托
        }
        void bind()
        {
            this.BeginInvoke(new testdelegate(test));

        }
        delegate void testdelegate();
        void test()
        {

            String[] s = { "111", "222" };
            for (int i = 0; i < s.Length; i++)
            {
                comboBox1.Items.Add(s[i]);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            Thread t = new Thread(new ThreadStart(bind));
            t.Start();
        }

    
    }


线程间操作无效:

访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。

.NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:“从不是创建控件control name的线程访问它。”

此异常在调试期间和运行时的某些情况下可靠地发生。强烈建议您在显示此错误信息时修复此问题。在调试以 .NET Framework 2.0 版之前的 .NET Framework 编写的应用程序时,可能会出现此异常。

可以通过将 CheckForIllegalCrossThreadCalls 属性的值设置为 false 来禁用此异常。这会使控件以与在 Visual Studio 2003 下相同的方式运行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值