如何获取发生异常的线程的名称?

时间:2012-08-02 08:52:27

标签: c# winforms thread-exceptions

我正在处理线程异常,但我想获取发生异常的Thread的名称。看来,当线程异常触发时,事件仍停留在主线程上,尽管我认为异常可能发生在另一个线程上。

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    ShowFaultDialog(e.Exception, "(Application) Thread Exception [" + System.Threading.Thread.CurrentThread.Name + "]");
}

4 个答案:

答案 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财产吗?此属性为您提供发生异常的方法名称和签名。