0

我在主窗口中创建了新的 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 挂起的这些消息之间。如何让它异步工作?

4

3 回答 3

4

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

尝试更多类似的东西

Thread CurrentLogWorker = new Thread(delegate(){
   while (true) {
      this.Dispatcher.Invoke(
                 DispatcherPriority.SystemIdle, 
                 new Action(()=>System.Windows.MessageBox.Show("asd")));
      Thread.Sleep(5000);
   }
});    
于 2013-04-30T11:22:22.947 回答
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();
于 2013-04-30T11:24:34.017 回答
0

你试图归档什么?

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

您应该将这两个放在 BeginInvoke 调用之外,并且只将 MessageBox.Show 放在 Action 内。

于 2013-04-30T11:23:26.580 回答