У меня есть то, что я считаю довольно хорошо структурированным приложением форм .NET 3.5 (модульные тесты, инъекция зависимостей, SoC, формы просто передают вход и выводят на экран и не выполняют никакой логики, ядда-ядда) Я просто пропуская знание winforms о том, как заставить этот бит работать.
Когда соединение с базой данных потеряно - частое явление - я обнаруживаю и обрабатываю его и хочу, чтобы всплыла модальная форма, блокирующая использование приложения до тех пор, пока соединение не будет восстановлено. Я не уверен на 100%, как это сделать, поскольку я не жду ввода пользователя, скорее, я опрашиваю базу данных, используя таймер.
Моя попытка состояла в том, чтобы создать форму с надписью на ней и сделать это:
partial class MySustainedDialog : Form {
public MySustainedDialog(string msg) {
InitializeComponent();
lbMessage.Text = msg;
}
public new void Show() {
base.ShowDialog();
}
public new void Hide() {
this.Close();
}
}
public class MyNoConnectionDialog : INoConnectionDialog {
private FakeSustainedDialog _dialog;
public void Show() {
var w = new BackgroundWorker();
w.DoWork += delegate {
_dialog = new MySustainedDialog("Connection Lost");
_dialog.Show();
};
w.RunWorkerAsync();
}
public void Hide() {
_dialog.Close();
}
}
Это не работает, поскольку _dialog.Close () является вызовом между потоками. Мне удалось найти информацию о том, как решить эту проблему, в форме Windows, но не в такой ситуации, когда вам нужно создать саму форму.
Может кто-нибудь дать мне совет, как добиться того, что я пытаюсь сделать?
РЕДАКТИРОВАТЬ: Пожалуйста, обратите внимание, что я пробовал Фоновый работник только из-за отсутствия других идей, потому что я не очень хорошо знаю, как работает многопоточность для пользовательского интерфейса, поэтому я полностью открыт для предложений. Я должен также отметить, что я не хочу закрывать форму, над которой они работают в настоящее время, я просто хочу, чтобы это появилось поверх этого. Как диалоговое окно OK / Отмена, но которое я могу открывать и закрывать программно (и мне нужно контролировать, как оно выглядит)