【发布时间】:2011-09-13 06:50:06
【问题描述】:
我正在尝试使用 Method.Invoke 来调用 Windows 窗体对话框,让用户执行一些选择/交互并继续执行。此调用调用发生在异步方法中。
虽然一切正常,但如果 windows 窗体上发生错误,则会引发未处理的异常,即使尝试捕获 TargetInvocationException 或只是 Exception。
两种形式都在同一个 winforms 项目中。我知道执行异步调用的其他方法在哪里,但这只是为了说明问题。
表单对话框如下:
public partial class FakeDialog : Form
{
public FakeDialog()
{
InitializeComponent();
}
private void btnOK_Click(object sender, EventArgs e)
{
throw new Exception("oh noes!");
this.DialogResult = DialogResult.OK;
this.Close();
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
public new DialogResult ShowDialog()
{
base.ShowDialog();
return this.DialogResult;
}
}
这是调用代码。 None 如果正在执行 catch 块,即使未调试也是如此(我的问题不是在 IDE 中调试异常,如提到的 here。以下导致未处理的异常)。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MethodInvoker simpleDelegate = new MethodInvoker(InvokeForm);
IAsyncResult tag = simpleDelegate.BeginInvoke(null, null);
simpleDelegate.EndInvoke(tag);
MessageBox.Show("All done");
}
private void InvokeForm()
{
try
{
Type t = typeof(FakeDialog);
MethodInfo showDialogMethod = t.GetMethod("ShowDialog", new Type[] { });
object dialog = Activator.CreateInstance(t);
System.Windows.Forms.DialogResult result = (System.Windows.Forms.DialogResult)showDialogMethod.Invoke(dialog, new object[] { });
MessageBox.Show(result.ToString());
}
catch (TargetInvocationException tie)
{
MessageBox.Show("Tie exception");
}
catch (Exception ex)
{
MessageBox.Show("general exception");
}
}
}
更新:
奇怪的是,我能够在调试运行时捕获异常(我确信 IDE 在这里提供帮助)。在不调试的情况下运行会导致未处理的异常。
此外,通过异步调用调用似乎没有什么不同。如果我只是调用 InvokeForm() (忽略所有 methodInvoker 的东西),我可以达到相同的结果。
使用 Visual Studio 2008 在 .NET 2.0 上运行。
【问题讨论】:
-
哪个框架?我无法在 4.0 上重现;还有……你为什么要异步开始/结束?在这里一无所获(但让生活变得艰难)
-
在框架 2.0 上。异步开始/结束只是为了有一个异步进程并在大型应用程序之外重现问题(在异步调用中调用对话框)。
-
我已经重现了这个错误。 .net 2 和 vs2010 仅当您在 vs 之外运行 exe 时才会引发未处理的异常
-
您可以通过将 Jit 调试添加到应用程序配置文件中来消除错误但它可以提供帮助。
标签: c# winforms reflection asynchronous