显示在另一个线程

时间:2017-04-06 07:00:22

标签: c# wpf

我创建了一个繁忙的框,其中包含一个不确定的进度条,该条在不同的线程上运行,以便在主要UI在繁重任务期间无响应时显示。现在的问题是,每当我显示忙碌的寡妇时,它会将开始菜单显示在前面,同时应用程序的主窗口以全屏运行,并在忙碌窗口关闭后立即恢复正常。

Start menu comes to front whenever i show the busy window

Application goes back to full screen once the busy window closes

我可以在代码中的任何地方使用后台工作人员轻松完成此操作,但我想要的是可重用的解决方案。谁能解释我为什么会这样?欢迎提出建议。

这是我对BusyBox的类定义

    class BusyBox
    {
    static BusyBoxWindow BbwP;
    static Thread WindowThread;

    public static void ShowBusy()
    {
    if (WindowThread == null)
        {
            WindowThread = new System.Threading.Thread(() =>
            {
                SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
                BbwP = new BusyBoxWindow();
                /*BbwP.Owner = HomeWindow.HomeW;*/  // this line throws the exception "The calling thread cannot access this object because a different thread owns it"
                BbwP.Show();

                BbwP.Closed += (s, e) =>
                {
                    Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
                };

                System.Windows.Threading.Dispatcher.Run();

            });
            WindowThread.SetApartmentState(ApartmentState.STA);
            WindowThread.Start();
        }
        else
        {
            BbwP.Dispatcher.Invoke(new Action(() => { BbwP.Show(); }));
        }
    }

    public static void CloseBusy()
    {
        BbwP.Dispatcher.Invoke(new Action(() => { BbwP.Hide(); }));
    }
}

2 个答案:

答案 0 :(得分:0)

我认为问题在于您需要在窗口之间建立父/子关系才能让它知道全屏窗口仍在顶部。但这意味着两个UI线程都需要抽取消息才能正常工作。这是行不通的,因为你说你正在阻止父母的UI线程。

解决方案(您似乎已经意识到)是不阻止UI线程并让它继续执行UI操作并将繁重的工作移到其他线程上 - 无论是后台工作者,{{1或者你认为合适的其他任何方式。

答案 1 :(得分:0)

在我将Busy窗口的ShowInTaskbar属性设置为false后,'任务栏'的奇怪行为消失了。谢谢大家对我的问题有所了解!