@Uran_90

Почему не открывается диалог WPF?

Суть проблемы такая: В диалоге, в параллельном потоке, вызывается выполнение хранимой процедуры. Выполнение длится около 20 мин, т.к. медленное соединение у сервера БД. Во время выполнения закрываю диалог и прерываю поток. После этого пробую запустить диалог заново (создаётся новый экземпляр), но диалог не открывается (хотя OnInitialized и OnActivated методы запускаются).
Код:
MainWindow
{
...
private void OnImport()
{
var frm = new SAPImportParametersWindow(DoEndImport, DoBeginImportByURL);
frm.Owner = MainWindow.Instance;
frm.ShowDialog();
frm.Close();
}

private int DoBeginImportByURL(string connectionString)
{
...
callSqlProcedure();// execute time ~ 20 min
...
}
...
}

Dialog : Window
{
...
private void buttonOk_Click()
{
...
backgroundWorker.DoWork += delegate
{
DoBeginImportByURL(connectionString);
}
...
DialogResult = true;
}

private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
backgroundWorker.CancelAsync();
_sAPImportDataEndDelegate = null;
_sAPImportDataByURLBeginDelegate = null;
DialogResult = false;
}
...
}
  • Вопрос задан
  • 2428 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
В целом, то что вы закрыли диалог совершенно не означает, что ваша длительная операция прервалась.
backgroundWorker.CancelAsync(); всего лишь информирует задачу, что её прерывают. Внутри обработчика backgroundWorker должна быть специальная проверка свойства CancellationPending, при установке которого нужно выполнять выход из потока обработки.
Закрытие формы не уничтожает поток с задачей - она будет выполняться, пока не дойдёт до конца.
Скорее всего при повторном открытии формы у вас происходит конфликт с ресурсами, которые уже используются первым потоком обработки.

Если смотреть дальше, то если вы выполняете длительную операцию на сервере, например, длительную хранимую процедуру, то даже закрытие приложения, которое запустило на выполнение эту хранимку, не гарантирует остановку процесса на сервере. Особенно, если процесс изменяет данные. В зависимости от логики сервера процесс может продолжиться до победного конца, может прерваться в какой-нибудь ключевой момент или уйти в длительный откат изменений, чтобы привести всё в состояние до запуска хранимки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы