4

我正在处理线程异常,但我想获取发生异常的线程的名称。似乎当线程异常触发时,事件仍保留在主线程上,尽管我认为异常可能发生在不同的线程上。

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

4 回答 4

2

在静态 void Main() 中:

Thread.CurrentThread.Name = "Main Thread";

VS 2010 显示主线程具有“主线程”的“名称”,但实际上线程名称为空。

于 2012-08-02T11:01:38.160 回答
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调用,在输出窗口中产生“工作线程”行)。

于 2012-08-02T09:07:09.747 回答
0

使用递增的数值变量(例如字节)为每个线程赋予它自己的名称,例如

string threadname = "Thread" + threadnumber

然后使用 catch 语句通知您,如下所示:

ShowFaultDialog(e.exception, threadname)

这样,理论上您就可以分辨出它是哪个线程。

于 2012-08-02T09:04:01.927 回答
0

正如我从 MSDN 中了解到的那样,Application_ThreadException事件允许 Windows 窗体应用程序处理Windows 窗体线程中发生的未处理异常,并且当您到达此事件时,您就处于主 UI 线程中。所以它会打印总是一样的。

你检查过Exception.TargetSite属性吗?此属性为您返回发生异常的方法名称和签名。

于 2012-08-02T09:07:11.650 回答