『QQ:1353814576』

WPF 异步线程操作界面控件


开发过程中不可避免会用到多线程更新主界面ui的情况,但子线程内又无法直接操作主线程界面,以下是异步线程通过委托修改主线程ui的的一个例子

第一步:创建一个WPF项目 添加一个TextBox 控件 如图 这里控件Name属性值为 textBox

第二步:后面添加一个方法用来修改文本框的Text属性值

        /// <summary>  
        /// 委托方法  
        /// </summary>  
        private void UpdateTextBox()  
        {  
            textBox.Text = "我是异步线程提供的值";  
        }

第三步:创建异步线程 把方法带入异步委托

            //创建异步线程  
            System.Threading.Tasks.Task task = new System.Threading.Tasks.Task(UpdateTextBox);  
            //启动线程  
            task.Start();

接着启动运行项目 会发现程序会提示异常

在WPF应用中,如果遇到多线程的需求时,如果线程内直接操作控件时会引发如下异常

System.InvalidOperationException:“调用线程无法访问此对象,因为另一个线程拥有该对象。”

解决办法: 将UpdateTextBox 委托方法内做如下修改

private void UpdateTextBox()
{
            ///在创建控件的基础句柄所在线程上异步执行指定委托。
            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                textBox.Text = "我是异步线程提供的值";
            }));  
}

再一次启动程序 就成功了