본문 바로가기

차장님의 이야기

C# 다양한 Delay 함수와 Delay 함수를 만들어 보기.

C#에는 여러가지 방법으로 Delay함수를 만들 수 있고, 사용이 가능하다.

 

대표적으로 이미 만들어져 있는것을 사용한다고 하면 

 

1. Task를 이용한 대기 함수

2. Thread를 이용한 대기 함수

3. System명령어를 이용한 대기 함수

4. 시간 측정을 이용한 대기 함수 만들기

 

내가 생각하기엔 이 4가지가 최선이자 모든것 이라고 생각한다. 

 

사용방법은 동기작업이든, 비동기 작업이든 똑같긴 하지만 방법의 차이라고 생각한다.

그리고 잘못 사용되었을 경우 다른게 멈출 가능성이 있는것이. 

Task와 Thread를 이용한 대기 함수라고 생각한다.

 

복잡한 관계에 있을 경우 다르게 멈출 가능성이 있다고 본다.

 

Task에서도 await 예약어가 붙은 Delay와 아닌 Delay총 2가지가 있다.

각각의 차이점은 async의 Scope(범위) 안에 있을 때, 아닐 때 로 분류가 된다.

Task.Delay(1000);

해당 코드는 "동기" 작업에서 1초를 대기 한다.

 

await Task.Delay(1000);

해당 코드는 "비동기" 작업에서 1초를 대기한다.

 

 

Thread.Sleep(1000);

그 다음엔 Thread를 이용한 대기 함수이다. 해당 함수는

현재 동작 중인 쓰레드에게 1초 동안 "정지" 하라는 의미 이다.

나중에 Thread를 여러개 만들었을 때

A와 B 쓰레드가 동작하고 있을 때.

A 쓰레드가 돌고 있던 중에 해당 코드를 만나게 되면 해당 쓰레드를 1초 동안 정지 시키고,

반대로 B가 돌고 있을 때 해당 코드를 만나게 되면 멈추게 된다.

 

Process.Start("sleep 1.0");

해당 코드는 리눅스에서 돌며, cmd 명령어를 수행해주는 기능이다.

코드 자체가 동기 작업이다.

 

static void MyDelay(int ms)
{
    var now = DateTime.Now;
    var after = DateTime.Now;

    after.AddMilliseconds(ms);

    while (now >= after)
    {
        now = DateTime.Now;
    }

    return;
}

마지막으로 Delay함수를 직접 만드는것 이다.

해당 코드는 DateTime이란 클래스 안에 Now란 Property(속성)이 존재한다. 해당 속성을 호출 하게 되면.

현재 PC의 시간을 반환해 준다.

즉 C++에 있는 clock()과 같은 기능이다.

 

대부분의 Delay함수의 구현이 현재 시간과 나중 시간을 측정하여 대기 함수를 만든다.