gpt4 book ai didi

c# - 如何使用 CancellationTokenSource 关闭另一个线程上的对话框?

转载 作者:太空狗 更新时间:2023-10-29 21:26:34 27 4
gpt4 key购买 nike

这与我的另一个问题有关How to cancel background printing .

我试图更好地理解 CancellationTokenSource 模型以及如何跨线程边界使用它。

我有一个主窗口(在 UI 线程上),后面的代码在其中执行:

 public MainWindow()
{
InitializeComponent();

Loaded += (s, e) => {
DataContext = new MainWindowViewModel();
Closing += ((MainWindowViewModel)DataContext).MainWindow_Closing;

};
}

关闭时正确调用 CloseWindow 代码:

 private void CloseWindow(IClosable window)
{
if (window != null)
{
windowClosingCTS.Cancel();
window.Close();
}
}

通过选择菜单项,在后台线程上创建第二个窗口:

    // Print Preview
public static void PrintPreview(FixedDocument fixeddocument, CancellationToken ct)
{
// Was cancellation already requested?
if (ct.IsCancellationRequested)
ct.ThrowIfCancellationRequested();

...............................

// Use my custom document viewer (the print button is removed).
var previewWindow = new PrintPreview(fixedDocumentSequence);

//Register the cancellation procedure with the cancellation token
ct.Register(() =>
previewWindow.Close()
);

previewWindow.ShowDialog();

}
}

在 MainWindowViewModel(在 UI 线程上)中,我放置:

public CancellationTokenSource windowClosingCTS { get; set; }

其构造函数为:

    // Constructor
public MainMenu()
{
readers = new List<Reader>();
CloseWindowCommand = new RelayCommand<IClosable>(this.CloseWindow);
windowClosingCTS = new CancellationTokenSource();
}

现在是我的问题。在 UI 线程上关闭 MainWindow 时,windowClosingCTS.Cancel() 会立即调用在 ct 中注册的委托(delegate),即调用 previewWindow.Close()。 这现在会立即返回到"If (Windows != null) with:

"The calling thread cannot access this object because a different thread owns it."

那我做错了什么?

最佳答案

您的问题是您的预览窗口在另一个线程上运行。当您触发取消时,您将在该线程上执行取消 token 的注册操作,而不是在运行预览的线程上。

这些情况下的黄金标准是不使用两个 UI 线程。这通常会造成麻烦,而您需要处理它们的工作通常是不值得的。

如果你想保留你的解决方案,或者如果你想从后台线程触发取消,你必须将你的关闭操作编码到你的窗口在其中打开的线程:

Action closeAction = () => previewWindow.Close();
previewWindow.Dispatcher.Invoke(closeAction);

关于c# - 如何使用 CancellationTokenSource 关闭另一个线程上的对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41010412/

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