在异步编程时,可以使用TaskScheduler来直接更新
下面代码在线程中去改变Label.Text的值,会出错
Task task = new Task(() =>
{
//这里报错,不能从其他线程访问它
label1.Text = "123";
});
如何解决
Task task = new Task(() =>
{
label1.Text = "123";
});
//解决
//类似一个invoke操作
task.Start(TaskScheduler.FromCurrentSynchronizationContext());
上面代码还有一个问题,如果更新界面之前有一个很耗时的操作,会导致界面直接卡死
实例:
Task task = new Task(() =>
{
//这时UI线程会卡死,等待十秒之后,去更新界面控件
Thread.Sleep(10000);
label1.Text = "123";
});
task.Start(TaskScheduler.FromCurrentSynchronizationContext())
如何解决
Task.Factory.StartNew(() =>
{
Thread.Sleep(10000);
})
.ContinueWith(t =>
{
label1.Text = "123";
} ,TaskScheduler.FromCurrentSynchronizationContext());