Я пытаюсь найти лучший способ управления несколькими формами в приложении 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()
, но я не смог придумать лучшего способа сделать это. Обратите внимание, что Form1
и Form2
не зависят друг от друга и никогда не общаются напрямую.
Я подумал об использовании счетного семафора для ожидания закрытия всех дисплеев, но это немного противоположно традиционному семафору. Вместо выполнения, когда ресурс становится доступным, я хочу заблокировать, пока все ресурсы не будут возвращены.
Есть мысли о лучшем подходе?