Я столкнулся со странной разницей между программой, запущенной в VS2005 и выполняющей исполняемый файл напрямую. По сути, когда исключение выдается в методе внутри вызова Application.DoEvents()
, исключение может быть перехвачено при запуске в Visual Studio. При запуске скомпилированного исполняемого файла исключение не перехватывается и программа вылетает.
Вот простой код, демонстрирующий проблему. Предположим, стандартный шаблон winforms, две кнопки и метка.
Для запуска нажмите кнопку «Пуск», чтобы начать отсчет 10 секунд. До истечения 10 секунд нажмите кнопку отмены. и исключение будет брошено внутри DoEvents()
. Исключение следует поймать. Это происходит только при работе внутри Visual Studio.
private void StartButton_Click(object sender, EventArgs e) {
DateTime start = DateTime.Now;
try {
while (DateTime.Now - start < new TimeSpan(0, 0, 10)) {
this.StatusLabel.Text = DateTime.Now.ToLongTimeString();
Application.DoEvents();
}
MessageBox.Show("Completed with no interuption.");
} catch (Exception) {
MessageBox.Show("User aborted.");
}
}
private void ButtonAbort_Click(object sender, EventArgs e) {
throw new Exception("aborted");
}
Я хочу быть в состоянии поймать эти исключения. Есть ли способ заставить его работать?
Обновление:
Я готов рассмотреть иные подходы, кроме тех, которые вызывают головную боль у новичка DoEvents()
. Но я не нашел тот, который, кажется, работает лучше. Мой сценарий состоит в том, что у меня есть длительный цикл, который контролирует некоторые научные инструменты, и часто приходится ждать стабилизации температуры или чего-то еще. Я хочу дать своим пользователям возможность прервать процесс, поэтому у меня есть кнопка отмены, которая просто генерирует пользовательское исключение, которое я собираюсь отследить на сайте, где процесс изначально запускается. Это казалось идеальным решением. За исключением того факта, что по какой-то причине он не работает.
Если не получается заставить это работать, есть ли лучший подход?
Обновление 2:
Когда я добавляю это как первую строку Main (), это заставляет его работать как исполняемый файл, но не в VS, поэтому ситуация меняется. Сумасшедшая вещь состоит в том, что это, кажется, бездействие. Я могу понять, как это что-то делает.
Application.ThreadException += delegate(
object sender,
System.Threading.ThreadExceptionEventArgs e
)
{ throw e.Exception; };
Это безумие.