240115-TIL

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