我在 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");
}
我希望能够捕获这些异常。有什么办法让它工作吗?
更新:
我愿意考虑 re-entrant-headache-inducing 以外的其他方法DoEvents()
。但我还没有找到一个似乎更好的工作。我的情况是我有一个长时间运行的循环来控制一些科学仪器,并且经常需要等待温度稳定或其他什么。我想让我的用户能够中止进程,所以我有一个中止按钮,它只是抛出一个自定义异常,我打算在最初启动进程的站点上捕获它。这似乎是一个完美的解决方案。除了由于某种原因它不起作用的事实。
如果无法使其正常工作,是否有更好的方法?
更新 2:
当我将它作为 Main() 的第一行添加时,它可以作为可执行文件工作,但不能在 VS 中工作,所以情况正好相反。疯狂的是,它似乎是无操作的。我能理解这是怎么做的。
Application.ThreadException += delegate(
object sender,
System.Threading.ThreadExceptionEventArgs e
)
{ throw e.Exception; };
疯了吧。