【发布时间】:2009-10-25 05:48:17
【问题描述】:
假设我有线程 1,主窗口 UI 线程和线程 2,一个模式形式的登录 UI 线程。
现在线程 1 执行一段代码并想要更改登录表单中的 UI 元素,因此它调用委托来更改线程 2 中的某些内容。但是当它这样做时,登录表单隐藏在主窗口后面,并且我没有办法把它带回来。在任务栏上选择它不会做任何事情,在调用方法的末尾写“Activate()”也不会做任何事情。
如何防止线程 2 的 UI 被隐藏?
谢谢
【问题讨论】:
-
另外,当只有一个线程时,在登录表单上使用 ShowDialog 会阻塞主窗口,并强制登录表单在前面。如果我有 2 个线程并且我可以在登录表单仍然打开时关闭主窗口,这将不再适用。我可以复制具有 2 个线程的单线程应用程序的行为吗?
-
你想要“阻塞”(模态)行为吗?也许你可以在登录表单中创建第二个线程,使用 BackgroundWorker 或类似的东西。禁用登录对话框上的所有控件,执行您需要的任何异步任务(登录?)然后当 BackgroundWorker 完成时解锁登录表单并说“抱歉,再试一次”,或者如果成功,表单将关闭并让您进入到主应用程序。
-
如果我这样做了,那么登录 UI 将与主 UI 相同,对吧?假设我需要独立的 UI 线程但依赖于 UI 行为。即,无论表格1 有多忙,我都希望表格2 绘制,但我不希望任务栏上有2 个图标。我也不希望在没有另一种形式的情况下显示一种形式。这可能在单独的线程上吗?
-
如果表格 1 可能“忙”,您的模式似乎很糟糕。在同一个线程中显示所有表单并使用工作线程执行任何异步操作是一种很好的做法。与其为表单 2 创建一个单独的线程,您能否为表单 1 正在执行的工作创建单独的线程,然后立即为表单 2 的 ShowDialog()?您可以通过将 Form.ShowInTaskbar 设置为 false 来阻止表单 2 在任务栏中显示。
-
好的,我现在看到约定了。我会试试的。只是如果我在不同的线程中执行所有操作,我必须在任何地方都使用 Invoke()。
标签: .net multithreading user-interface delegates invoke