레이블이 닷넷쓰레드인 게시물을 표시합니다. 모든 게시물 표시
레이블이 닷넷쓰레드인 게시물을 표시합니다. 모든 게시물 표시

2022년 2월 25일 금요일

C# Thread Interrupt, Abort를 이용한 쓰레드 종료

 

http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=426 


(동영상)C# 쓰레드(Thread) Interrupt, Abort를 이용한 쓰레드 종료

(동영상)C# 쓰레드(Thread) Interrupt, Abort를 이용한 쓰레드 종료C# ThreadInterrupt, Abort를 이용한 쓰레드 종료C# 멀티 쓰레드(쓰레드 종료방법)쓰레드는 할일을 마치고 수명이 다해 스스로 종료하는것이

ojc.asia


C# Thread

Interrupt, Abort를 이용한 쓰레드 종료







C# 멀티 쓰레드(쓰레드 종료방법)



쓰레드는 할일을 마치고 수명이 다해 스스로 종료하는것이 좋지만 부득이 강제로 종료해야 하는 경우가 있다.


종료하는 방법은 강제종료를 위한 Abort,  종료시킬 쓰레드에 Interrupt를 걸어서 그 쓰레드가 Wait, Sleep, Join 상태(이때 쓰레드 상태는 ThreadState.WaitSleepJoin.)가 되면 ThreadInterruptedException이 발생하므로 catch 절에서 예외를 받아서 쓰레드를 종료하면 된다. 



Thread.Interrupt 메소드 : 쓰레드가 동작중인 상태를 피해서 WaitSleepJoin 스레드 상태에 들어갔을 때  ThreadInterruptedException을 던져 예외처리부에서 쓰레드를 중지시                                  킴.

쓰레드가 WaitSleepJoin 상태일 때 : 즉시 ThreadInterruptedException 발생
쓰레드가 Running 상태일 때 : ThreadInterruptedException을 예약, WaitSleepJoin일때 ThreadInterruptedException 발생

Thread.Abort 메소드 :쓰레드를 강제로 종료하는데 프로세스 자신이나 시스템에 영향이 없는 경우에 사용하면 되지만 가능한 사용안하는 것이 좋다.



using System.Threading;

using System;

 

namespace ThreadInterrupt

{

    class Program

    {

        public static Thread sleeperThread;

 

        public static void Main(string[] args)

        {

            sleeperThread = new Thread(new ThreadStart(ThreadToSleep));

            sleeperThread.Start();

            sleeperThread.Interrupt();

        }

        private static void ThreadToSleep()

        {

            int i = 0;

            while (true)

            {

                Console.WriteLine("[Sleeper : " + i++ + "]");

                if (i == 9)

                {

                    try

                    {

                        Console.WriteLine("i가 9가 되어 1초쉼...");

                        Thread.Sleep(1000);

                    }

                    catch (ThreadInterruptedException e)

                    {

                        Console.WriteLine("ThreadInterruptedException ...");

                        Environment.Exit(0);

                    }

                }

            }

        }

    }

 

[결과]

[Sleeper : 0]

[Sleeper : 1]

[Sleeper : 2]

[Sleeper : 3]

[Sleeper : 4]

[Sleeper : 5]

[Sleeper : 6]

[Sleeper : 7]

[Sleeper : 8]

i가 9가 되어 1초쉼...

ThreadInterruptedException …



[Thread.Abort예제]

using System;

using System.Threading;

public class Example

{

    public void Work()

    {

        for (char i = 'A'; i < 'Z'; i++)

        {

            Console.WriteLine(i);

            Thread.Sleep(1000);

        }

    }

}

public class Test

{

    public static void Main()

    {

        Example exam = new Example();

        Thread x = new Thread(new ThreadStart(exam.Work));

        Thread y = new Thread(new ThreadStart(exam.Work));


        x.Start();

        y.Start();

        Thread.Sleep(3000);

        try

        {

            x.Abort();

            y.Abort();

        }

        catch (ThreadAbortException except)

        {

            Console.WriteLine(except.ToString());

        }

        Console.WriteLine("Bye Bye!!");

    }

}




#쓰레드, #Thread, #Interrupt, #Abort, #쓰레드종료, #스레드종료, #닷넷쓰레드, #시샵스레드, #시샵교육, #닷넷교육, #쓰레드Abort, #쓰레드Interrupt, 쓰레드, Thread, Interrupt, Abort, 쓰레드종료, 스레드종료, 닷넷쓰레드, 시샵스레드, 시샵교육, 닷넷교육, 쓰레드Abort, 쓰레드Interrupt,  

2022년 2월 24일 목요일

C# 스레드(Thread), HelloWorld, ThreadStart, ParameterizedThreadStart 동영상

 

C# 쓰레드 중단 / 재시작 (Suspend, Resume)


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=425 


[동영상]C# 쓰레드(Thread) 중단 / 재시작 Suspend, Resume

[동영상]C# 쓰레드(Thread) 중단 / 재시작 Suspend, ResumeC# Thread중단 / 재시작Suspend, Resume쓰레드 중단 / 재시작 (Suspend, Resume)쓰레드를 쉬게 하는 방법은 Thread.Suspend를 이용할 수도 있다. Sleep과의 차이는

ojc.asia


https://www.youtube.com/watch?v=-0lJyIjwl3s&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=28 

쓰레드를 쉬게 하는 방법은 Thread.Suspend를 이용할 수도 있다. Sleep과의 차이는 Sleep인 경우에는 지정한 시간 만큼 쉰다는 의미지만 Suspend인 경우에는 Resume 메소드를 호출할 때까지 쉬게 된다는 것이다. 또 다른 차이점은 Sleep 메소드는 현재 쓰레드를 일시중지하게 하는 정적 메소드로 자기 자신의 쓰레드만 쉬게 할 수 있다. 반면에 Suspend 는 자기 뿐 아니라 다른 쓰레드도 쉬게 할 수 있다. Suspend로 잠을 자고 있는 Thread가 스스로 깰 수는 없다. 그래서 Suspend로 쉬고 있는  쓰레드는 다른  쓰레드가 Resume을 이용하여 깨울 때 까지 쉬고 있는 것이다. 주의할 점은 Sleep인 경우는 쓰레드가 즉시 중단 되지만 Suspend로 쉬게하면 중단해도 되는 안전한 상황까지 즉시 중단 되지 않을 수도 있다.


Suspend 메소드로 쓰레드를 잠시 중지하면 Resume 메소드로 다시 동작하게 할 수 있지만 Thread.Abort로 일단 쓰레드를 종료시키면 다시 되살릴 수 없다.


using System;

using System.Threading;

public class Test

{

    public bool sleep = false;


    public void First()

    {

        for (int i = 0; i < 10; i++)

        {

            //1.5초 동안 쉬면서 F0, F1, ..., F5까지 출력하고 쉼

            Thread.Sleep(1500);

            Console.WriteLine("F{0}", i);


            if (i == 5)

            {

                sleep = true;

                Console.WriteLine("");

                Console.WriteLine("first 쉼...");

                Thread.CurrentThread.Suspend();

            }

        }

    }


    public static void Main()

    {

        Test t = new Test();


        Thread first = new Thread(new ThreadStart(t.First));

        first.Start();



        //메인이 아래에서 대기 합니다.

        //쓰레드가 실행하는 First 메서드에서 i가 5가 되면 쉬면서 sleep을 true로 만드는데, 그때까지 쉼, 6초 동안 쉼

        while (t.sleep == false) { }


        Console.WriteLine("first를 깨웁니다...2초후 깨어 납니다.");


        //2초동안 메인이 대기

        Thread.Sleep(2000);


        //쓰레드를 깨움, i가 5가되고 2초 후 쓰레드 재시작

        first.Resume();

    }

}





#시샵동영상, #닷넷쓰레드, #hread, #Suspend, #Resume, #시샵교육, #닷넷교육, #닷넷동영상, #시샵쓰레드, #스레드,시샵동영상, 닷넷쓰레드, hread, Suspend, Resume, 시샵교육, 닷넷교육, 닷넷동영상, 시샵쓰레드, 스레드,  

 #시샵동영상#닷넷쓰레드#hread#Suspend#Resume#시샵교육#닷넷교육#닷넷동영상#시샵쓰레드#스레드시샵동영상닷넷쓰레드hreadSuspendResume시샵교육닷넷교육닷넷동영상시샵쓰레드스레드,

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart

 

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart 

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart 




C# Thread

HelloWorld


ThreadStart

ParameterizedThreadStart







C# 스레드(Thread)


  • 스레드는 하나의 프로세스(실행 중인 프로그램) 내에 존재하는 순차적인 제어의 흐름을 두기 위해 사용한다. 즉 프로세스는 하나 이상의 스레드로 이루어 진다.


  • 각 스레드는 코드, 데이터, 힙 영역은 공유하며, Stack Frame은 별도로 할당되는데 이를 Thread Stack이라하며 Thread Stack은 메소드 단위로 분리되어 할당되며 실행이 끝나면 Stack Frame은 사라진다. 


  • 멀티 스레드가 제대로 동작하기 위해서는 CPU가 여러 개 있어야 한다. 단일 CPU를 사용하게 되면 CPU는 한 번에 하나의 스레드를 사용한다. 만약 멀티 스레드로 프로그램이 실행되는 경우라면 CPU의 사용 시간을 나누어서 각각의 스레드에게 주기 때문에 단일 쓰레드와 별차이가 없다.


  • C#에서 스레드를 만들기 위해서는 기 정의된 Thread 클래스와 ThreadStart, ParameterizedThreadStart 델리게이트를 이용하면 된다. 


public delegate void ParameterizedThreadStart(object obj);

한 개의 파라미터를 object 형식으로 전달하기 때문에 여러 개의 파라미터를 전달하기 위해서는 클래스나 구조체를 만들거나 배열 등을 이용하여 전달할 수 있다. 파라미터 전달은 Thread.Start() 메소드를 호출할 때 전달한다. 


public delegate void ThreadStart();

스레드가 실행시킬 메소드가 파라미터를 받아들이지 않는 형태이며, ThreadStart를 이용해 파라미터를 전달하는 방법은 ThreadStart 델리게이트가 처다보는 메소드는 파라미터를 받아들이지 않으므로 그 메소드 안에서 다른 메소드를 호출하면서 파라미터를 전달할 수 있다.


  • C#에서 스레드를 위한 클래스들은 System.Threading 네임스페이스 안에 정의되어 있다.



[실습]

1부터 50까지의 합을 5개의 쓰레드에 나누어서 실행하고자 한다. 

첫번째 쓰레드는 1~10 까지의 합을, 두번째 쓰레드는 11~20 까지의 합을.... 다섯번째 쓰레드는 

41~50 사이의 합을 구하는데 아래 두 방법으로 프로그램을 작성하세요. 


- ParameterizedThreadStart 델리게이트를 이용하여 작성하세요. 

- ThreadStart 델리게이트를 이용하여 작성하세요


1. ParameterizedThreadStart 델리게이트를 이용하여 작성


using System;

using System.Threading;

namespace ConsoleApplication2

{

    class Program

    {

        static int mysum = 0;

        static void DoSomething(object n)

        {

            int sum = 0;

            int[] number = (int[])n;

            for (int i = number[0]; i <= number[1]; i++)

            {

                sum += i;

            }

            mysum += sum;

        }

        static void Main(string[] args)

        {

            Thread t1 = new Thread(new ParameterizedThreadStart(DoSomething));

            Thread t2 = new Thread(new ParameterizedThreadStart(DoSomething));


            Thread t3 = new Thread(new ParameterizedThreadStart(DoSomething));


            Thread t4 = new Thread(new ParameterizedThreadStart(DoSomething));

            Thread t5 = new Thread(new ParameterizedThreadStart(DoSomething));

            


            t1.Start(new int[] { 1, 10 });             t2.Start(new int[] { 11, 20 });

            t3.Start(new int[] { 21, 30 });            t4.Start(new int[] { 31, 40 });

            t5.Start(new int[] { 41, 50 });

            

            t1.Join();   t2.Join();    t3.Join();     t4.Join();       t5.Join();


            Console.Write("1부터50까지의 합은{0}::", mysum);

        }

    }

}



2. ThreadStart 델리게이트를 이용하여 작성


using System;

using System.Threading;


namespace ConsoleApplication3

{

    class Program

    {

        static int mysum = 0;

        static void Sum(object n)

        {

            int sum = 0;

            int[] number = (int[])n;

            for (int i = number[0]; i <= number[1]; i++)

            {

                sum += i;

            }

            mysum += sum;

        }


        static void Main(string[] args)

        {            

            Thread t1 = new Thread(new ThreadStart(() => Sum(new int[] { 1, 10 })));

            Thread t2 = new Thread(new ThreadStart(() => Sum(new int[] { 11, 20 })));


            Thread t3 = new Thread(new ThreadStart(() => Sum(new int[] { 21, 30 })));


            Thread t4 = new Thread(new ThreadStart(() => Sum(new int[] { 31, 40 })));

            Thread t5 = new Thread(new ThreadStart(() => Sum(new int[] { 41, 50 })));

            


            t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start();

            t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join();


            Console.WriteLine(mysum);


        }

    }

}




#시샵동영상, #스레드, #Thread, #HelloWorld, #ThreadStart,#ParameterizedThreadStart, #닷넷쓰레드, #쓰레드, #닷넷동영상, #닷넷교육, #시샵교육, 시샵동영상, 스레드, Thread, HelloWorld, ThreadStart,ParameterizedThreadStart, 닷넷쓰레드, 쓰레드, 닷넷동영상, 닷넷교육, 시샵교육, 
 

 #시샵동영상#스레드#Thread#HelloWorld#ThreadStart#ParameterizedThreadStart#닷넷쓰레드#쓰레드#닷넷동영상#닷넷교육#시샵교육시샵동영상스레드ThreadHelloWorldThreadStartParameterizedThreadStart닷넷쓰레드쓰레드닷넷동영상닷넷교육시샵교육,

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...