有时候在异步代码里直接更新界面UI会报错:调用线程无法访问对象,因为另一个线程拥有该对象。
我们可以使用如下来解决这个问题:
// 这里的this.window就是窗口实例,我是通过属性传到线程A类
this.window.Dispatcher.Invoke(new Action(() => {
// 进行原来窗口对象的操作 do soming...
}));
但是每次这样写又会觉得麻烦…
因此可以它封装成一个静态类,使用很简单,
public static class UIThread
{
private static Action executor = action => action();
public static void InitializeWithDispatcher()
{
var dispatcher = Dispatcher.CurrentDispatcher;
executor = action =>
{
if (dispatcher.CheckAccess())
action();
else dispatcher.BeginInvoke(action);
};
}
public static void OnUIThread(this Action action)
{
executor(action);
}
}
使用很简单,程序入口处调用InitializeWithDispatcher函数
public class Program
{
public static void Main(string[] args)
{
UIThread.InitializeWithDispatcher();
}
}
以后使用的时候,只需调用OnUIThread函数即可。
UIThread.OnUIThread(new Action(() => {
//do something
}));