2012-08-02 5 views
4

스레드 예외를 처리하고 있지만 예외가 발생한 스레드의 이름을 가져 오려고합니다. 스레드 예외가 발생하면 다른 스레드에서 예외가 발생할 수 있다고 생각되지만 이벤트가 주 스레드에 남아있는 것으로 보입니다.예외가 발생한 스레드의 이름은 어떻게 얻을 수 있습니까?

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

스레드 예외가 잡히게 될 때까지 이미 스레드 예외가 발생하여 불행히도이 시점에서 스레드 ID를 얻을 수있는 방법이 없습니다. 당신이 할 수있는 최선의 방법은 Exception의 스택을 검사하여 예외를 던진 코드를 찾아내는 것입니다. 코드에서 수정할 수 있다면 스레드 ID를보고하기 위해 throw/catch 처리를 throwing 코드에 추가 할 수 있습니다. –

+0

VS의 스레드 디버그 창에서 스레드를 살펴본 결과 스레드가 이미 파괴 된 것 같습니다. Duw – James

+0

사실 이름은 사용 가능하지만 주 스레드는 VS 2010에서보고 한 내용에도 불구하고 이름이 없습니다. – James

답변

2

:

Thread.CurrentThread.Name = "Main Thread"; 

VS 2010

는 "메인 스레드 '의'이름 '을 가진 같은 메인 스레드를 표시하지만 실제로 스레드 이름이 null입니다.

0

은 당신이 그렇게 좋아하는 그 자신의 이름 예를 들어

string threadname = "Thread" + threadnumber 

의 각 스레드를 제공하기 위해 (예 : 바이트 등) incrememnted 숫자 변수를 사용하여 그리고 알리기 위해 catch 문을 사용하여

그런 식으로 당신은 이론적으로 어떤 실을 말할 수있을 것입니다.

+0

고마워, 내 스레드는 이미 이름이 있습니다. 매튜 왓슨 (Matthew Watson)은이 시간까지 스레드가 이미 파괴되었음을 지적했습니다. – James

+0

글쎄,해볼 만하니. 스레딩에 대한 많은 경험이 없으며 C#을 처음 접했습니다. 나는 단지 논리적 인 것을 시도하고 있었다. 예외가 무엇인지 아는 경우에는 예외가 발생하기 전에 항상 다른 스레드를 모니터링하는 별도의 스레드로 이름을 시도하고 출력 할 수 있습니다. – Pharap

+0

불행히도 예외는 타사 구성 요소이므로 캡처가 어렵습니다. .NET의 스레드 개체에 별도의 캡처 이벤트가 없으면 예외가있는 스레드의 스레드 이름 캡처가 가능하지 않을 수도 있습니다. – James

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 이벤트가 발생하고 출력 창에 'Worker Thread'행을 생성하는 CurrentDomain_UnhandledException이 호출됩니다.

+0

.NET 응용 프로그램 내의 모든 스레드에서 스레드 예외가 발생합니다. 3 개 또는 4 개의 스레드가 메인 스레드와 함께 실행됩니다. – James

+0

MSDN의 @James : '이 이벤트를 사용하면 Windows Forms 응용 프로그램에서 Windows Forms 스레드에서 발생하는 처리되지 않은 예외를 처리 할 수 ​​있습니다. Windows Forms에서 만들고 소유하지 않은 스레드에서 발생하는 예외를 catch하려면 UnhandledException 이벤트 처리기 '를 사용하십시오. 여기 비고 섹션 참조 : http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx – Dennis

+1

관련성이 보이지 않습니다. ThreadException이 실행 중입니다. 타사 구성 요소는 winforms입니다. – James

0

MSDN에서 알 수 있듯이 Application_ThreadException 이벤트를 사용하면 Windows Forms 응용 프로그램에서 Windows Forms 스레드에서 발생하는 처리되지 않은 예외를 처리 할 수 ​​있으며이 이벤트에 도달하면 기본 UI 스레드에 있습니다. 그래서 항상 똑같이 인쇄됩니다.

Exception.TargetSite 속성을 확인하셨습니까? 이 등록 정보는 예외가 _ 생한 메소드 이름과 서명을 다시 제공합니다. 정적 무효 메인()에서

관련 문제