2017-10-03 5 views
0

이 문제는 다른 스택 오버플로 질문과 비슷합니다. How to kill a thread instantly in C#? 이 질문은 문제를 설명하고 비슷한 문제에 대한 해결책을 제시하는 좋은 방법입니다. 내 문제는 코드가 이벤트 중심적이고 루프에서 실행되지 않는다는 것입니다.이벤트를 수신하는 스레드를 닫는 적절한 방법은 무엇입니까

응용 프로그램을 닫을 때 오류를 수정하려고합니다. 응용 프로그램은 이벤트를 수신하는 스레드에서 인스턴스화 된 클래스를 가지며, 이벤트를 수신하면 일부는 작동하고 계속 청취합니다. 이러한 이벤트는 세션 당 한 번 또는 수천 번 발생할 수 있습니다. 이 모든 것이 잘 작동합니다.

이 스레드는 주 응용 프로그램의 생성자에서 시작되며 응용 프로그램이 닫힐 때만 종료되어야하며 스레드가 정지 한 시간의 절반이며 작업 관리자를 통해 닫아야합니다. 앱이 다운됩니다.

이 스레드를 종료하는 올바른 방법은 무엇입니까?

Public Main_App_Constructor() 
{ 
    ... 
    usrIface = new UserInterface(); 
    usrIface.Start(); 
    ... 
} 

private void Application_Exit(object sender, ExitEventArgs e) 
{ 
    ... 
    usrIface.Stop(); 
    ... 
} 

Public class UserInterface 
{ 
    CommandListener listener; 
    Thread listnerThread; 

    Public UserInterface() 
    { 
     listener = new CommandListener(); 
     listnerThread = new Thread(new 
     ThreadStart(listner.BeginListneingForEvents)); 
     listnerThread.SetApartmentState(ApartmentState.STA); 
     listnerThread.Name = "Listner"; 
    } 

    Public void Start() 
    { 
     listnerThread.Start(); 
    } 

    Public void Stop() 
    { 
     listnerThread.Abort(); 
    } 
} 

Public class CommandListener 
{ 
    EventLauncher eventer; 

     Public CommandListener() 
    { 
     eventer = new EventLauncher(); 

     eventer.event1 += eventer_event1; 
     eventer.event2 += eventer_event2; 
     eventer.event3 += eventer_event3; 
     ... 
    } 

    private void eventer_event1(object sender, eventArgs e) 
    { 
     //Does stuff 
    } 

    private void eventer_event2(object sender, eventArgs e) 
    { 
     //Does stuff 
    } 

    private void eventer_event3(object sender, eventArgs e) 
    { 
     //Does stuff 
    } 
} 
+0

나는 나의 질문이 참조 된 것과 다른 점을 분명히했다. 동일하면 다른 스레드의 솔루션을 구현하는 방법을 명확히하십시오. – TTalma

답변

-1

따르면 Microsoft's documentation에, 스레드는 전혀 즉시 중단 보장되지 않거나

: 여기

몇 가지 간단한 코드입니다.

가능한 해결책은이 Stack Overflow question here에서 논의되었습니다. 일부는 공유 변수를 사용하거나 스레드 자체에서 상태 변수를 설정하여 작업을 중지하도록 요청할 것을 제안합니다. 또 다른 제안은 SecurityPermissionAttribute attribute을 추가하고 ControlThreadtrue과 같게 설정하는 것입니다. 나는 그걸 가지고 놀지 않았지만, 앞으로 나아 가기 전에이 장소에서 시작할 것입니다.

관련 문제