求教大家一个线程异常的简单老问题
代码如下
private void button1_Click(object sender, EventArgs e)
{
BeginThreadX();
}
private Thread thread;
public void BeginThreadX()
{
thread = new Thread(ExcpThread);
thread.Start();
}
public void ExcpThread()
{
string i = "helloworld";
throw new Exception("thread excp");
}
点击按钮之后开启一个线程,在线程中抛出异常
同时在main函数中已做捕捉
static void Main()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.ThreadException -= new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException -= new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
这时候虽然有捕捉到异常,可还是一样会程序崩溃(ctrl+f5)运行下
如果F5调试,就是个不断抛异常的循环过程,这个太奇妙了
网上都说只要ThreadException ,UnhandledException 抓下就行了,实际好像不行
求教大家看看
------解决方案--------------------
这个问题应该是你创建的thread throw exception, 但你没有处理,clr会将这个exception抛给process,process中也没有处理,所以,最后process直接退出。
一般,写多线程,都应该处理exception。
例如:
C/C++ code
public void BeginThreadX()
{
Task<string> task = new Task<string>(ExcpThread);
task.ContinueWith(tempTask =>
{
try
{
MessageBox.Show(tempTask.Result);
}
catch (AggregateException ex)
{
MessageBox.Show("Got error");
}
});
task.Start();
}
public string ExcpThread()
{
this.textBox2.Text = "test";
string i = "helloworld";
throw new Exception("thread excp");
}