동기(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();
}
}
참조
'프로그래밍 > (도서)C#코딩의기술-실전' 카테고리의 다른 글
[C#] 코딩의기술(실전편) - 2.2 변화하는 조건 (0) | 2022.03.31 |
---|---|
[C#] 코딩의기술(실전편) - 1.7 예외처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.6 강제 종료 처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.5 비동기 처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.4 병렬처리 (0) | 2022.03.31 |