2024. 1. 15. 21:16ㆍ내일배움캠프
1월 15일 아직 팀프로젝트를 진행중이다.
오늘 팀 프로젝트 진행중에
'아 이 출력문을 1초 있다 보여주는 방법이 없을까?'
라는 생각에 열심히 해당 내용을 열심히 공부를 해봤다.
C#에는 여러가지 방법으로 Delay를 시킬수 있는 방법이 있다.
1. Task를 사용한다.
2. Thread를 사용한다.
3. System 명령어를 이용한다.
4. 시간 측정을 이용한 대기 함수를 만들어 사용한다.
Task.Delay(1000); // "동기'작업에서 1초를 대기 한다.
await Task.Delay(1000); // "비동기" 작업에서 1초를 대기한다.
Thread.Sleep(1000); // 지금 동작 중인 쓰레드에게 1초동안 "정지"
Process.Start("sleep 1.0"); // 리눅스에서 돌면서 , cmd 명령어를 수행해주는 기능 코드자체가 동기작업
static void MyDelay(int ms) // Delay함수를 직접 만들어서 사용하는것
{
var now = DateTime.Now;
var after = DateTime.Now; // DeteTime이란 클래스 안에 Now라는 프로퍼티가 존재
// 해당 속성을 호출하면 현재 pc의 시간을 반환해준다
// C++ clock()과 같은 기능
after.AddMilliseconds(ms);
while (now >= after)
{
now = DateTime.Now;
}
return;
}
동기와 비동기 머리가 또 복잡해진다.
동기와 비동기의 차이를 코드와 함께 살펴보자
static void Main(string[] args)
{
number1();
number2();
}
static void number1() // 우리가 일반적으로 사용하는 동기 작업
{
Console.WriteLine("동기!");
Console.WriteLine("1st");
Console.WriteLine("2st");
Console.WriteLine("3st");
}
static async Task number2() // 같은 내용을 비동기 작업으로 바꾸어보았다
{
Console.WriteLine();
Console.WriteLine("비동기!");
Console.WriteLine("1st");
await Task.Delay(1000);
await Task.Run(() => { Console.WriteLine("2st"); });
Console.WriteLine("3st");
}
결과를 보면 동기 작업의 부분은 우리가 생각하는 대로 1,2,3 순서대로 잘 나왔다
하지만? 비동기 부분은 1st부분만 나오고 뒤에 2,3부분은 나오지 않았다
왜 그런지 구조를 설명하자면
메인 실행 -> 내부의 함수 실행 -> 메인 종료 의 순서대로 흘러가는게 일반 코드의 흐름이지만
비동기 함수로 만들면 이 비동기 함수는 순차적으로 실행되는게 아니라 비동기 함수 부분의 비동기 호출 부분에서 함수는
비동기 작업 영역으로 넘어간다. 이 비동기 작업 영역에서 잠깐 대기하는 동안 메인이 종료가 되기 때문에
함수가 끝까지 출력되지 못하고 종료하는 것이다.
즉
동기
요청과 결과가 동시에 일어난다. 요청 후 결과가 나와야 다음 단계로 넘어갈 수 있다.
설계가 간단하고 직관적이지만 요청작업이 끝날때 까지 해당 프로세스는 블로킹 상태에 머물러 있어야 한다.
비동기
요청과 결과가 동시에 일어나지 않는다. 이 때문에 해당 프로세스가 블로킹 상태에 있지 않는다
그 시간동안 다른 작업을 할 수 있어 작업을 효율적으로 할 수 있다.
오늘은 Delay기능을 사용하기 위해 공부했던걸 TIL로 정리해보았다.
1월 15일 TIL은 여기서 마치도록 하겠다.
'내일배움캠프' 카테고리의 다른 글
240118-TIL (0) | 2024.01.18 |
---|---|
240116-TIL (0) | 2024.01.16 |
240112-TIL (0) | 2024.01.12 |
240111-TIL (0) | 2024.01.11 |
240110-TIL (0) | 2024.01.10 |