C#의 Thread.Sleep()
-
thread.sleep()
이C#
에서 유해한 이유 -
thread.sleep()
이C#
에서 작동하는 방식 - 비동기 프로그래밍
-
두 메서드를 동시에 실행(C#의
async
및await
키워드)
이 가이드에서는 C#에서 thread.sleep()
을 사용하는 것이 유해한 것으로 간주되는 이유와 이 특정 접근 방식을 사용하지 말아야 하는 이유를 배웁니다.
thread.sleep()
을 사용하면 어떻게 됩니까? 다른 접근 방식이 있습니까?
이 가이드에서 모든 것을 알아보십시오. 뛰어들어봅시다.
thread.sleep()
이 C#
에서 유해한 이유
thread.sleep()
이 왜 해로운지 이해하려면 이 메서드의 이면에 있는 작업을 이해해야 합니다. 음, C#에서 sleep
메소드가 사용됩니다.
특정 기간 동안 현재 기능(스레드 실행)을 일시 중지하거나 일시 중지하는 데 사용할 수 있습니다. 스레드 실행을 잠시 중단하기 위해 밀리초 단위로 시간을 전달할 수 있습니다.
아래 코드와 같이 TimeSpan
속성을 사용할 수도 있습니다.
// Time in milliseconds
Thread.Sleep(5000);
Or
// Time in hours, minutes, seconds
TimeSpan tsObj = new TimeSpan(0, 0, 5);
Thread.Sleep(tsObj);
이제 위의 두 가지 방법 모두 5초 동안 프로그램을 중지합니다. 즉, 위의 코드를 통해 스레드를 1초 동안 일시 중단하려고 합니다.
그러나 이 모든 것의 의미는 무엇입니까? 그것의 작동을 이해합시다.
thread.sleep()
이 C#
에서 작동하는 방식
우리는 모두 프로그램이 줄 단위로 실행된다는 것을 알고 있습니다. 즉, 전체 프로그램이 한 줄씩 동기적으로 실행됩니다. 때로는 프로그래밍 중에 완료하는 데 시간이 걸리는 작업을 수행해야 합니다.
예를 들어 API에서 데이터를 가져오는 경우 sleep
기능을 사용하여 대기하고 API에서 해당 데이터를 가져오고 나중에 프로그램의 나머지 부분을 실행할 수 있습니다. 이것은 필요하지만 매우 해롭고 열악한 접근 방식입니다.
예를 들어, 우리가 가져오려는 데이터가 크고 시간이 걸릴 수 있습니다. 우리 프로그램은 그 시간 동안 중단됩니다. 그것은 이상적인 접근 방식이 아닙니다.
Thread.Sleep(n)
은 n
밀리초 동안 가능한 한 많은 타임 슬라이스(스레드 양자라고도 함) 동안 실행 중인 스레드를 중지하는 것을 의미합니다. 타임 슬라이스의 지속 시간은 Windows의 버전/유형 및 사용된 프로세서에 따라 다르지만 일반적으로 15~30밀리초 동안 지속됩니다.
이는 스레드가 n
밀리초 이상 동안 차단될 가능성이 있음을 나타냅니다. 스레드가 정확히 n
밀리초 후에 다시 깨어날 가능성은 거의 없습니다.
따라서 Thread.Sleep
은 타이밍에 아무런 역할을 하지 않습니다.
쓰레드는 대략 200,000 사이클 생성과 100,000 사이클 파괴가 필요한 유한 자원입니다. 기본적으로 각 컨텍스트 전환에 2,000–8,000 주기를 사용하고 스택용으로 1MB의 가상 메모리를 예약합니다.
대체 접근 방식은 무엇입니까
우리는 때때로 프로그램이 완벽하게 실행되도록 스레드를 지연해야 합니다. 위에서 언급했듯이 시간이 걸리는 일부 API 데이터를 가져와야 할 수 있습니다.
그러나 그것 때문에 전체 프로그램을 중지하는 것은 나쁜 접근 방식입니다. 그렇다면 어떻게 피할 수 있습니까?
비동기 프로그래밍을 소개합니다.
비동기 프로그래밍
C#의 async
및 await
키워드는 요즘 비동기 프로그래밍을 매우 일반적으로 만드는 데 도움이 됩니다. 전체 애플리케이션은 UI로 작업할 때 작업이 완료될 때까지 기다려야 하며 대용량 파일을 읽거나 버튼을 클릭하는 것과 같이 시간이 오래 걸리는 장기 실행 방법을 사용해야 합니다.
즉, 동기 응용 프로그램의 프로세스가 차단되면 전체 응용 프로그램도 중지되고 전체 작업이 완료될 때까지 응용 프로그램이 작동을 멈춥니다.
이러한 상황에서 비동기 프로그래밍은 매우 유용합니다. 애플리케이션은 비동기 프로그래밍을 사용하여 완료에 의존하지 않는 작업을 계속할 수 있습니다.
async
및 await
키워드의 도움으로 훨씬 적은 작업으로 기존 비동기 프로그래밍의 모든 이점을 얻을 수 있습니다.
두 메서드를 동시에 실행(C#의 async
및 await
키워드)
FirstMethod()
및 SecondMethod()
라는 두 가지 메서드가 있으며 서로 독립적이고 FirstMethod()
가 작업을 수행하는 데 오랜 시간이 걸린다고 가정해 보겠습니다.
동기 프로그래밍은 FirstMethod()
로 시작하여 완료될 때까지 기다렸다가 SecondMethod()
로 이동한 다음 실행됩니다. 두 절차가 독립적이더라도 프로세스에 많은 시간이 소요됩니다.
간단한 스레드 프로그래밍을 사용하여 모든 기능을 동시에 실행할 수 있지만 작업이 완료될 때까지 기다리는 동안 사용자 인터페이스가 차단됩니다. 기존 프로그래밍에서는 이 문제를 해결하기 위해 많은 코드를 작성해야 했지만 async
및 await
키워드를 사용하면 훨씬 적은 코드로 문제를 해결할 수 있습니다.
다른 예도 살펴보겠습니다. 이 경우 SecondMethod()
가 FirstMethod()
에 종속된 경우 await
키워드를 사용하여 FirstMethod()
실행이 완료될 때까지 기다립니다.
C#에서 async
및 await
는 작업이 완료되었을 때 컨트롤이 반환되어야 하는 위치를 나타내는 코드 마커입니다.
실제 예제부터 시작하면 뒤에 있는 프로그래밍을 더 잘 이해하는 데 도움이 됩니다. 다음 코드를 살펴보십시오.
class Program {
static void Main(string[] args) {
FirstMethod();
SecondMethod();
Console.ReadKey();
}
public static async Task FirstMethod() {
await Task.Run(() => {
for (int i = 0; i < 100; i++) {
Console.WriteLine(" First Method");
// Do something
Task.Delay(100).Wait();
}
});
}
public static void SecondMethod() {
for (int i = 0; i < 25; i++) {
Console.WriteLine(" Second Method ");
// Do something
Task.Delay(100).Wait();
}
}
}
위 코드의 출력은 다음과 같을 것입니다.
First Method
Second Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
First Method
Second Method
Second Method
Second Method
Second Method
Second Method
위의 코드에서 볼 수 있듯이 하나의 스레드 실행을 중지해야 하기 때문에 전체 프로그램이 중지되지 않습니다. 둘 다 비동기 프로그래밍을 사용하여 동시에 실행할 수 있습니다.
시간이 걸리는 일부 API 데이터를 가져와야 하는 시점에 있다고 가정해 보겠습니다. 따라서 프로그램은 데이터를 가져오지 않고 다음 줄로 이동하므로 해당 데이터를 가져오기 위해 약간 지연된 다음 다음 줄로 이동해야 합니다.
Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.
LinkedIn