IT Share you

실행중인 모든 스레드를 종료하는 방법은 무엇입니까?

shareyou 2020. 12. 13. 11:25
반응형

실행중인 모든 스레드를 종료하는 방법은 무엇입니까?


다음 코드는 응용 프로그램을 종료하지 않습니다. 응용 프로그램을 종료하고 실행중인 모든 스레드가 닫혔는지 확인하려면 어떻게해야합니까?

foreach (Form form in Application.OpenForms)
{
    form.Close();
}
Application.Exit();

코드에서 스레드 사용을 표시하지 않지만 스레드가 있다고 가정 해 보겠습니다. 모든 스레드를 닫으려면 시작하기 전에 모든 스레드를 백그라운드 스레드로 설정해야합니다. 그러면 응용 프로그램이 종료 될 때 자동으로 닫힙니다. 예 :

Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);

Microsoft의 "HOWTO : Stop Multiple Threads"기사 : http://msdn.microsoft.com/en-us/library/aa457093.aspx


다음 코드를 시도해 볼 수 있습니다.

Environment.Exit(Environment.ExitCode);

나는 내 소프트웨어에서 비슷한 문제를 겪었지만 불행히도 백그라운드에서 스레드가 작동하도록 만드는 것만으로는 문제가 해결되지 않았습니다. 실제로 스레드가 데이터를 가져 오는 동안 (주 소프트웨어는 데이터 기반 임) 응용 프로그램을 닫으면 Windows 오류가 발생하여 디버깅 메시지가 나타납니다.

그래서 실제로 나를 위해 일한 것은 :

1 단계 : 모든 스레드가 다음과 같은 백그라운드에서 실행되도록합니다.

Thread aThread = new Thread(MethodName);
aThread.IsBackground = true; //<-- Set the thread to work in background
aThread.Start();

2 단계 : 양식 / 응용 프로그램의 닫기 작업에서 다음과 같은 Environment.Exit 메서드를 호출합니다.

Environment.Exit(Environment.ExitCode);

이것은 메모리 누수없이 완벽하게 관리 된 메모리를 유지했습니다.

도움이 되었기를 바랍니다.


이것은 당신이 연 모든 스레드에서 작동합니다.

protected override void OnExiting(Object sender, EventArgs args)
{
    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);
}

이것은 나를 위해 일을 마쳤습니다.

사용하는 대신:

Application.Exit() 

다른 스레드를 열어두면 다음을 사용해보십시오.

Environment.Exit(Environment.ExitCode);

다음은 애플리케이션을 강제로 닫는 가장 좋은 방법입니다.

(Process.GetCurrentProcess()).Kill()

문제 Environment.Exit는 메인 스레드에 있지 않으면 작동하지 않는다는 것입니다. 또한 때때로 스레드가 잠 깁니다.

프로그램이 제대로 닫히지 않는 주된 이유는 양식이 자체 (및 생성 된 모든 개체)를 삭제할 수 없기 때문입니다. 이것을 고치는 것은 훨씬 더 어렵습니다. 가능한 dispose 핸들러가 먼저 호출 될 때까지 잠시 기다린 후 위 코드를 실행하는 것이 좋습니다.

참고 URL : https://stackoverflow.com/questions/2688923/how-to-exit-all-running-threads

반응형