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 = "我是异步线程提供的值";
}));
}
再一次启动程序 就成功了