我正在处理线程异常,但我想获取发生异常的Thread的名称。看来,当线程异常触发时,事件仍停留在主线程上,尽管我认为异常可能发生在另一个线程上。
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
ShowFaultDialog(e.Exception, "(Application) Thread Exception [" + System.Threading.Thread.CurrentThread.Name + "]");
}
答案 0 :(得分:2)
在static void Main()中:
Thread.CurrentThread.Name = "Main Thread";
VS 2010将主线程显示为具有“主线程”的“名称”,但实际上线程名称为空。
答案 1 :(得分:1)
如果你的意思是处理Application.ThreadException
事件:它只会触发从WinForms线程抛出的异常。通常,应用程序中有一个WinForms线程:主线程。
<强>更新强>
以下是演示Application.ThreadException
和AppDomain.UnhandledException行为差异的示例:
1)Program
课程:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
Debug.WriteLine(Thread.CurrentThread.Name);
}
}
2)主窗体(带有两个按钮的窗体)代码隐藏:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
throw new InvalidOperationException();
}
private void button2_Click(object sender, EventArgs e)
{
new Thread(() => { throw new InvalidOperationException(); })
{
Name = "Worker Thread"
}.Start();
}
}
当您单击button1时,您将从WinForms线程中抛出异常。因此,默认情况下会在Application_ThreadException
处理此异常。
当你点击button2时,你正在从工作线程抛出异常,这不是WinForms线程。在这种情况下不会触发Application.ThreadException
,而是触发AppDomain.UnhandledException
事件(并调用CurrentDomain_UnhandledException
,在输出窗口中生成“工作线程”行。)
答案 2 :(得分:0)
使用增量数字变量(例如byte)为每个线程提供自己的名称,例如
string threadname = "Thread" + threadnumber
然后使用catch语句通知您:
ShowFaultDialog(e.exception, threadname)
从理论上讲,你可以告诉它是哪个线程。
答案 3 :(得分:0)
据我了解,MSDN中Application_ThreadException事件允许Windows窗体应用程序处理 Windows窗体线程中出现的未处理异常,当您到达此事件时,您将进入主UI线程。因此它将始终打印相同。
你检查了Exception.TargetSite财产吗?此属性为您提供发生异常的方法名称和签名。