【问题标题】:Close modal dialog before opening another another (multithreading)在打开另一个对话框之前关闭模态对话框(多线程)
【发布时间】:2020-07-22 01:51:20
【问题描述】:

我有一个应用程序,其线程会根据需要弹出模式对话框。

如果一个模态对话框在线程要弹出它自己的时候打开,我需要先关闭前一个模态对话框,然后才能允许线程弹出一个新对话框。

以下链接帮助我更好地理解了问题,但没有找到可行的解决方案:

Singleton modal dialog

Windows Forms: wait until another form closes

How can I make execution pause until new form is closed?

preventing multiple instance of one form from displaying

How can I make a single instance form (not application)?

一个自我管理的表格将是理想的。那么,互斥体?辛格尔顿?一个正确的实现让我望而却步。

谢谢大家。

【问题讨论】:

  • 您不能在 windows 窗体中使用多个线程。您必须使用启动第一个表单时使用的同一线程。

标签: c# multithreading winforms modal-dialog


【解决方案1】:

您不应从任何线程打开任何表单/对话框,但运行您的主表单的主线程除外。

正确的方法是使用Invoke 或更好的BeginInvoke 将消息从您的线程发送到您的主窗体 - 在您的主窗体上创建一个公共方法,使主窗体可用于您的线程并使用@ 987654323@调用你的方法。

您的方法应该按照您的意愿处理模态对话框。

【讨论】:

  • 多线程设置无济于事。它是一个 Office 插件。
  • 那又怎样? Office 加载项还有一个“主”UI 线程。请解释一下。
  • 我可以模拟多个调用并使用例如 CancellationTokenSource 来终止正在运行的模式没问题。但是当代码插入 Word 时,就没有乐趣了。不知道为什么。
  • 但是我还是不明白你为什么需要多个线程。同样,所有与 UI 相关的操作,包括从加载项访问 Word,都应仅从主线程进行。
  • 我不需要多个线程。事实证明,它们是由鼠标钩子多次触发并调用外接程序产生的。模式设置为 1 秒后自动关闭(通过 Task.Delay.ContinueWith > Close)。因此,在 1 秒之前关闭模式需要中断任务,而我只能在 Word 之外进行测试,而不能在 Word 中进行测试。
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多