Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住。
Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不是UI线程,所以不会造成界面卡住。但其内部不能直接对UI操作,所以若需要访问UI,需要将访问UI的那部分代码用Control.Dispatcher.BeginInvoke包起来,其中Control属于你要访问的UI,或者说Control与你要访问的UI在同一线程。
示例:
new Action(() =>
{
//耗时非UI操作放这
Control.Dispatcher.Invoke(new Action(() =>
{
//操作UI(同步)
}));
Control.Dispatcher.BeginInvoke(new Action(() =>
{
//操作UI(异步)
}));
//耗时非UI操作放这
}).BeginInvoke(null, null);