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

static void Main()の場合:

Thread.CurrentThread.Name = "Main Thread";

VS 2010は、メインスレッドが「メインスレッド」の「名前」を持っていることを示していますが、実際にはスレッド名はnullです。

于 2012-08-02T11:01:38.160 に答える
1

イベントの処理を意味するApplication.ThreadException場合:WinFormsスレッドからスローされた例外に対してのみ発生します。通常、アプリケーションにはメインスレッドという1つの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)メインフォーム(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ます(呼び出され、出力ウィンドウに「WorkerThread」行が生成されます)。

于 2012-08-02T09:07:09.747 に答える
0

MSDNから理解しているように、Application_ThreadExceptionイベントを使用すると、WindowsフォームアプリケーションでWindowsフォームスレッドで発生する未処理の例外を処理できます。このイベントに到達すると、メインのUIスレッドになります。したがって、常に同じように印刷されます。

Exception.TargetSiteプロパティを確認しましたか?このプロパティは、例外が発生したメソッド名とシグネチャを返します。

于 2012-08-02T09:07:11.650 に答える
0

増加した数値変数(バイトなど)を使用して、各スレッドに独自の名前を付けます。

string threadname = "Thread" + threadnumber

次に、catchステートメントを使用して次のように通知します。

ShowFaultDialog(e.exception, threadname)

そうすれば、理論的には、それがどのスレッドであるかを知ることができます。

于 2012-08-02T09:04:01.927 に答える