Dispatcher.Invoke挂起主窗口

时间:2013-04-30 11:18:26

标签: wpf dispatcher

我在主窗口中创建了新的WPF项目:

public MainWindow()
{
    InitializeComponent();

    Thread Worker = new Thread(delegate(){

        this.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, new Action(delegate
        {
            while (true)
            {
                System.Windows.MessageBox.Show("asd");

                Thread.Sleep(5000);
            }
        }));
    });

    Worker.Start();
}

问题出在MainWindow挂起的那些消息之间。我如何让它异步工作?

3 个答案:

答案 0 :(得分:4)

因为您告诉UI线程要休眠,并且您没有让调度程序返回处理其主消息循环。

尝试更像

的内容
Thread CurrentLogWorker = new Thread(delegate(){
   while (true) {
      this.Dispatcher.Invoke(
                 DispatcherPriority.SystemIdle, 
                 new Action(()=>System.Windows.MessageBox.Show("asd")));
      Thread.Sleep(5000);
   }
});    

答案 1 :(得分:0)

您尝试归档什么?

你的while-Loop和Thread.Sleep()在UI-Thread上执行,所以难怪MainWindow挂起。

你应该把这两个放在BeginInvoke调用之外,而只放在Action里面的MessageBox.Show。

答案 2 :(得分:0)

您发送给Dispather.BeginInvoke的委托代码在主线程中执行 你不应该在BeginInvoke方法的委托中睡觉或做其他长时间的工作。

你应该在像BeginInovke这样的方法之前做很长时间的工作。

Thread CurrentLogWorker = new Thread(delegate(){
    while (true)
    {
        this.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(delegate
        {
            System.Windows.MessageBox.Show("asd");
        }));

        Thread.Sleep(5000);
    }
});
CurrentLogWorker.Start();