繁体   English   中英

多显示器应用程序中的表单管理

[英]Form management in a multi-display application

我试图找出在使用双监视器的C#应用​​程序中管理多种表单的最佳方法。 该应用程序从“启动板”开始,该启动板仅向操作员提供一些快速信息和“ GO”按钮。 按下该按钮将隐藏启动板,并以全屏方式在每个监视器上显示一个表单。 我试图在这里捕获相关代码:

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()调用中保留主线程的感觉有点混乱,但是我还没有想到一种更好的方法来执行此操作。 请注意, Form1Form2彼此独立,并且从不直接通信。

我考虑过使用计数信号量来等待所有显示关闭,但这与传统信号量有些相反。 我想在所有资源都返回之前阻塞,而不是在资源可用时执行。

对更好的方法有什么想法吗?

起初,我认为这会起作用:

您可以使用事件作为示例:2个ManualResetEvent对象。 主线程将使用WaitHandle.WaitAll和2个Mutexes数组等待事件。 每个线程都会获得对1个事件的引用,并在事件完成时发出信号(在死亡之前)。

但是后来我发现您最好使用2个互斥锁,然后等待它们。 这样,如果线程异常终止而没有“发出信号”(释放互斥锁),您将获得一个AbandonedMutexException,可以并且应该处理。 您可以使用AbandonedMutexException.MutexIndex知道哪个线程导致了异常。

您可以看一下这个答案 ,看看如何处理互斥体和异常

注意:

  1. AbandonedMutexException是.NET Framework 2.0版中的新增功能。 在以前的版本中,当互斥锁被放弃时,WaitAll方法将返回true。 放弃的互斥表示严重的编码错误。 该异常包含对调试有用的信息。
  2. Windows 98或Windows Millennium Edition上不会引发此异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM