关于Control.Dispatcher.BeginInvoke卡界面

  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);

posted @ 2017-08-24 18:50  ShaynChow  阅读(650)  评论(0编辑  收藏  举报