gpt4 book ai didi

c# - 即使调度程序优先级设置为后台,在返回所有 UI 线程之前也无法关闭新的 WPF 窗口

转载 作者:行者123 更新时间:2023-12-03 12:55:56 25 4
gpt4 key购买 nike

我是 WPF 的新手,如果我做了任何严重错误的事情,我会在前进的过程中弥补它。

一旦特定用户控件完成其业务,我有一个主窗口会创建一个新的“错误窗口”。当后台线程正在更新“错误窗口”的另一部分时,这个新的错误窗口会向 UI 返回一个“加载占位符”。

        ErrorsWindow errorWindow = new ErrorsWindow();
errorWindow.LoadingPlaceholder.Text = string.Format(@"Loading...
Please wait {1} minutes and {0} seconds to see potential errors",
ConfigurationManager.AppSettings["ErrorWindowWaitSeconds"],
ConfigurationManager.AppSettings["ErrorWindowWaitMinutes"]);
errorWindow.Show();
this.Dispatcher.BeginInvoke((Action)(() =>
{
errorWindow.SetupWindow();
}), System.Windows.Threading.DispatcherPriority.Background);

所以我的 errorWindow 显示在 UI 中,加载占位符文本设置正确。然后,UI 等待 1 分 30 秒,让 errorWindow.SetupWindow() 方法完成。问题是,在此等待期间,在 errorWindow.SetupWindow() 方法完成之前,我无法关闭窗口。
有没有办法让窗口关闭并中止后台线程?

编辑:我不能使用后台 worker 或任务,因为我需要更新 errorWindow.SetupWindow() 方法中的 UI 元素

谢谢你的期待

最佳答案

Dispatcher 上调用任何内容(如果 Dispatcher 属于 UI 线程)将仅在 UI 线程上运行您的委托(delegate) .因此,在 UI 线程忙于其他地方之前,您无法关闭窗口。

设置优先级DispatcherPriority.Background不会让它在后台线程上运行。它设置的是委托(delegate)DispatcherPriority背景。这意味着 Dispatcher 上优先级高于 Background 的所有排队代表将在您的委托(delegate)有时间执行之前先运行 .

如果您想在后台线程上运行您的操作,请使用 TaskBackgroundWorker .

根据 MSDN 的定义:

Executes the specified delegate asynchronously at the specified priority on the thread the Dispatcher is associated with.



如上所述,它在调度程序的关联线程上运行委托(delegate)。 (在您的情况下可能是 UI 线程)。

关于c# - 即使调度程序优先级设置为后台,在返回所有 UI 线程之前也无法关闭新的 WPF 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22173382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com