我试图找出在使用双显示器的 C# 应用程序中管理多个表单的最佳方法。应用程序从一个“启动板”开始,它只是为操作员提供一些快速信息和一个“开始”按钮。按下该按钮会隐藏启动板并在每个监视器上全屏显示一个表单。我试图在这里捕获相关代码:
private static List<Thread> _displays = new List<Thread>();
// "GO" button handler
private void OnClick(Object sender, EventArgs args) {
Launch(new Form1());
Launch(new Form2());
WaitForAllDisplays();
}
private static void Launch(Form form) {
Thread thread = new Thread(LaunchDisplay);
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start(form);
_displays.Add(thread);
}
private static void LaunchDisplay(Object obj) {
Form display = obj as Form;
// [snip] logic to place form on correct monitor [/snip]
display.ShowDialog();
}
public static void WaitForAllDisplays() {
foreach (Thread thread in _displays) {
thread.Join();
}
}
在这个调用上让主线程阻塞感觉有点乱WaitForAllDisplays()
,但我一直想不出更好的方法来做到这一点。注意Form1
和Form2
是相互独立的,从不直接通信。
我考虑使用计数信号量来等待所有显示关闭,但这与传统信号量有点相反。我不想在资源可用时执行,而是想阻塞直到返回所有资源。
对更好的方法有任何想法吗?