프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 1.3 순차처리

Victory_HA 2022. 3. 31. 22:24

동기(Synchronous), 비동기(Asynchronous), 블락(Blocking), 넌블락(Non-Blocking)의 개념

Task

  • 값을 반환하지 않고 일반적으로 비동기식으로 실행되는 단일 작업을 나타냅니다.
  • 일반적으로 주 응용 프로그램 스레드에서 동기식으로 실행되지 않고 스레드 풀 스레드에서 비동기식으로 실행합니다.

Task.Delay 메서드 VS Thread.Sleep 메서드

Thread.Sleep 메서드

  • 메서드 호출시 지정한 밀리 초 만큼 기다립니다.
  • 지정한 시간 이후 메서드가 반환됩니다.

Task.Delay 메서드

  • 지정한 밀리 초 후에 완료되는 Task를 생성합니다.
  • Task를 생성한 직후 메서드는 곧 바로 반환되고, Task가 해당한 밀리 초 만큼 기다립니다.
  • Task.Delay(1000).Wait()와 같은 형식으로 Wait() 메서드 붙이면 Task의 실행이 완료되기를 기다립니다.연속 Task
  • Task.Delay() 호출 후 실행 할 코드를 Task로 실행할 수 있습니다.
  • 지정한 시간만큼 기다린 후 실행 할 Code를 별도의 Task로 실행합니다.
    Task.Delay(1000).ContinueWith((dummy) => {( // 실행 할 Code )});

사용예제

class Program
{
    static void Main(string[] args)
    {
        File.Delete("sample.txt");
        Task.Delay(1000).ContinueWith((dummy) =>
        {
            try
            {
                Console.WriteLine(File.ReadAllText("sample.txt"));
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        });

        Task.Delay(1000).Wait();
        File.WriteAllText("sample.txt", "hi~");
        Console.ReadLine();
    }
}

lock 키워드

  • 스레드는 다른 스레드와의 자원을 공유하는 경우가 많습니다.
  • 스레드는 다른 스레드에 끼어들어 제멋대로 자원을 사용하는 경우가 있습니다.
  • 스레드들이 순서를 갖춰 자원을 사용하게 하는 것을 동기화라고 합니다.
  • 스레드 동기화에서 가장 중요한 점은 자원을 한 번에 하나의 스레드가 사용하게 하는 것입니다.
  • lock 키워드로 감싼 코드는 한 번에 한 스레드만 사용할 수 있는 코드 영역이 됩니다.

사용예제

class Program
{
    static void Main(string[] args)
    {
        File.Delete("sample.txt");
        object obj = new object();

        Task.Run(() =>
        {
            try
            {
                lock(obj)
                {
                    Console.WriteLine(File.ReadAllText("sample.txt"));
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        });

        Task.Delay(1000).Wait();
        File.WriteAllText("sample.txt", "hi~");
        Console.ReadLine();
    }
}

참조