abort는 그냥 죽어라! (보장은 안함) 라는 느낌이라면
join은 죽어줄때 까지 기다려 줄께~! 인데
코드 예제를 보면 abort는 서비스로 구성된 while 루프를 죽이고 있고
join은 일회성 쓰레드를 죽이는 예제로 설명되어 있는걸 보면..
맘편하게 abort로 죽어! 해야하려나?
[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/destroying-threads]
쓰레드 보다는 간접적인 방법을 쓰라고 권장 -_ㅠ
.NET Framework 4부터 다중 스레딩을 사용하는 권장 방법은 TPL(작업 병렬 라이브러리) 및 PLINQ(병렬 LINQ)를 사용하는 것입니다. 자세한 내용은 병렬 프로그래밍을 참조하세요. |
[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/threads-and-threading]
.NET Core는 Thread.Abort 메서드를 지원하지 않습니다. .NET Core에서 강제로 타사 코드 실행을 종료해야 하는 경우 별도의 프로세스에서 실행하고 Process.Kill를 사용합니다. |
[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/using-threads-and-threading]
obsolete를 사용되지 않는으로 해석해버렸군.
아무튼 abort는 .net 5.0 이후에서는 컴파일 경고가 뜬다고 하니
반강제적으로 TPL이나 PLINQ로 가게 만들려는 정책인듯?
이 메서드는 사용되지 않습니다. .NET 5.0 이상 버전에서이 메서드를 호출 하면 컴파일 타임 경고가 생성 됩니다. 이 메서드는 PlatformNotSupportedException 런타임에 .net 5.0 이상 및 .Net Core에서을 throw 합니다. |
[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]
using System; using System.Threading; public class Example { static Thread thread1, thread2; public static void Main() { thread1 = new Thread(ThreadProc); thread1.Name = "Thread1"; thread1.Start(); thread2 = new Thread(ThreadProc); thread2.Name = "Thread2"; thread2.Start(); } private static void ThreadProc() { Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name); if (Thread.CurrentThread.Name == "Thread1" && thread2.ThreadState != ThreadState.Unstarted) if (thread2.Join(TimeSpan.FromSeconds(2))) Console.WriteLine("Thread2 has termminated."); else Console.WriteLine("The timeout has elapsed and Thread1 will resume."); Thread.Sleep(4000); Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name); Console.WriteLine("Thread1: {0}", thread1.ThreadState); Console.WriteLine("Thread2: {0}\n", thread2.ThreadState); } } |
[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.join?view=net-5.0]
using System; using System.Threading; class Test { public static void Main() { Thread newThread = new Thread(new ThreadStart(TestMethod)); newThread.Start(); Thread.Sleep(1000); // Abort newThread. Console.WriteLine("Main aborting new thread."); newThread.Abort("Information from Main."); // Wait for the thread to terminate. newThread.Join(); Console.WriteLine("New thread terminated - Main exiting."); } static void TestMethod() { try { while(true) { Console.WriteLine("New thread running."); Thread.Sleep(1000); } } catch(ThreadAbortException abortException) { Console.WriteLine((string)abortException.ExceptionState); } } } |
[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]
'Programming > c# & winform' 카테고리의 다른 글
c# postgresql 패키지 (0) | 2022.04.27 |
---|---|
winform udp 소켓 여러개 (0) | 2021.10.26 |
Dispatcher / Control BeginInvoke() (0) | 2021.10.20 |
this.BeginInvoke()가 느려! (0) | 2021.10.20 |
크로스 스레드 작업이 잘못되었습니다 (0) | 2021.10.19 |