[.Net] ์ง์ฐ(Delay) ํจ์๋ค์ ํน์ง๊ณผ ์ฐจ์ด์ ์ ๋ฆฌ
์ง์ฐ(Delay) ํจ์
ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๋จ๋ฐ์ฑ์ผ๋ก ์คํํ๋ ์ค๋ ๋ ํจ์๊ฐ ์๊ณ , ํ๋ก๊ทธ๋จ์ด ์์๋ ํ ์ข ๋ฃ๋๊ธฐ ์ง์ ๊น์ง ์คํ๋๋ ์ค๋ ๋ ํจ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์์ ๊ฒฝ์ฐ์๋ ์ค๋ ๋ ํจ์ ๋ด์ ๋ฐ๋ณต๋ฌธ์ ๋ฃ์ด์ ๊ตฌํ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ๋ฐ๋ณต๋ฌธ์ ์ง์ฐ(Delay) ํจ์๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ๊ณผ๋ํ ์ฐ์ฐ์ผ๋ก ์ธํด CPU ๋ถํ๊ฐ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค.
CPU ๋ถํ๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ์ค๋ ๋ ํจ์์ ๋ฐ๋ณต๋ฌธ ์์๋ Sleep() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค. ์ฌ์ค ๊ผญ ์ค๋ ๋ ํจ์์ ๋ฐ๋ณต๋ฌธ์๋ง ํด๋นํ๋ ๊ฒ์ ์๋๋๋ค. ๊ณผ๋ํ ๋ฐ๋ณต๋ฌธ ๋ด์๋ ์ง์ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด CPU ๋ถํ๊ฐ ๋์์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฐ๋ฐ ์ง์ฐ์ ์ํ ํจ์๋ก๋ Sleep() ๋ฟ๋ง ์๋๋ผ AutoResetEvent.WaitOne()๋ ์๊ณ Task.Delay()๋ ์์ต๋๋ค. ๋ณธ๋ฌธ์์๋ ๊ฐ ์ง์ฐ ํจ์์ ๋ฐ๋ฅธ ์ฐจ์ด์ ์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
์ง์ฐ ํจ์์ ์ข ๋ฅ
1. Thread.Sleep() ํจ์
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํจ์์ด์ฃ . ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ ๋ง ๊ฐ๋จํฉ๋๋ค. ํจ์ ์ธ์๋ก ๋ฐ๋ฆฌ๋ฏธํฐ ์๊ฐ ๋๋ TimeSpan ์๊ฐ์ ์
๋ ฅํ๋ฉด ํด๋น ์๊ฐ๋งํผ ์ง์ฐ๋ฉ๋๋ค.
public static void Sleep (int millisecondsTimeout);
์ฌ์ฉ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
using System;
using System.Threading;
class Example
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Sleep for 2 seconds.");
Thread.Sleep(2000);
}
Console.WriteLine("Main thread exits.");
}
}
/* ์์ ์คํ ๊ฒฐ๊ณผ:
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Main thread exits.
*/
MSDN ๋ฌธ์๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
https://learn.microsoft.com/ko-kr/dotnet/api/system.threading.thread.sleep?view=net-7.0
Thread.Sleep ๋ฉ์๋ (System.Threading)
์ง์ ๋ ์๊ฐ ๋์ ํ์ฌ ์ค๋ ๋๋ฅผ ์ผ์ ์ค๋จํฉ๋๋ค.
learn.microsoft.com
2. WaitHandle.WaitOne() ํจ์
์ด ํจ์๋ WaitHandle์ด Set()์ด ๋ ๋๊น์ง ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๋์์ ํฉ๋๋ค. ํจ์ ์ธ์๋ Sleep() ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฐ๋ฆฌ๋ฏธํฐ ์๊ฐ ๋๋ TimeSpan ์๊ฐ์ ์
๋ ฅํฉ๋๋ค.
ํ์ง๋ง ๋์์ Sleep()๊ณผ ๋ค๋ฆ
๋๋ค. ํ์์์ ์๊ฐ ๋ด์ WaitHandle์ด Set์ด ๋๋ฉด, ํ์์์๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
public virtual bool WaitOne ();
์์ ์ฝ๋๋ ๋ณด๊ฒ ์ต๋๋ค.
using System;
using System.Threading;
class WaitOne
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// autoEvent๊ฐ Set์ด ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.\nMain ending.");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
//๋๋คํ ์๊ฐ ๋๊ธฐ
Thread.Sleep(new Random().Next(100, 2000));
//๋๊ธฐ ํ autoEvent๋ฅผ Set ํฉ๋๋ค
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
MSDN ๋ฌธ์๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
https://learn.microsoft.com/ko-kr/dotnet/api/system.threading.waithandle.waitone?view=net-7.0
WaitHandle.WaitOne ๋ฉ์๋ (System.Threading)
ํ์ฌ WaitHandle์ด(๊ฐ) ์ ํธ๋ฅผ ๋ฐ์ ๋๊น์ง ํ์ฌ ์ค๋ ๋๋ฅผ ์ฐจ๋จํฉ๋๋ค.
learn.microsoft.com
3. Task.Delay() ํจ์
์ด ํจ์๋ ๋น๋๊ธฐ ํจ์๋ก, Task์ async/await ํค์๋์ ๊ฐ์ด ์ค๋ช
ํ๊ธฐ์๋ ๋ด์ฉ์ด ๋๋ฌด ๋ง์ผ๋ฏ๋ก, Delay() ํจ์์ ๋ํด์๋ง ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ํจ์์ ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ธ์๋ก ๋ฐ๋ฆฌ๋ฏธํฐ ์๊ฐ์ ์
๋ ฅํ๋ ๊ฒ์ด ๋ชจ๋ ๋น์ทํฉ๋๋ค.
public static System.Threading.Tasks.Task Delay (int millisecondsDelay);
์ฝ๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"{DateTime.Now.ToString("T")} Wait ์์!");
Task.Delay(5000).Wait();
Console.WriteLine($"{DateTime.Now.ToString("T")} Wait ์ข
๋ฃ!");
}
}
}
Task.Delay().Wait()๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ฝ๋ ๋ถ๋ถ์์ ์ค์ ๋ ์๊ฐ๋งํผ ์ง์ฐ๋ฉ๋๋ค. ํด๋น ํจ์์ MSDN ๋ฌธ์๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
https://learn.microsoft.com/ko-kr/dotnet/api/system.threading.tasks.task.delay?view=net-7.0
Task.Delay ๋ฉ์๋ (System.Threading.Tasks)
์๊ฐ ์ง์ฐ ํ ์๋ฃ๋๋ ์์ ์ ๋ง๋ญ๋๋ค.
learn.microsoft.com
์ ๋ฆฌ
๊ฐ ์ง์ฐ ํจ์์ ์ธ์๋ก ๋ฐ๋ฆฌ๋ฏธํฐ ์๊ฐ์ ๋ฃ์ด ์ฌ์ฉํ๋ค๋ ์ธก๋ฉด์์๋ ๋ชจ๋ ๋์์ด ๋์ผํด ๋ณด์ ๋๋ค. ๊ทธ๋ผ ์ด๋ ์ํฉ์์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋ ๊ฑธ๊น์?
1. ๋๋ต์ ์ธ ์๊ฐ์ผ๋ก ์ง์ฐํ๊ณ ์ถ์ ๋
Sleep() ํจ์๋ ๋์ ์ ๋ฐ๋๋ฅผ ๊ฐ๊ณ ์์ง ์์ต๋๋ค. ํ์ง๋ง ์ด ๋จ์ ์ด์์ผ๋ก ๋๋ต์ ์ธ ์ง์ฐ์ด ํ์ํ๊ฑฐ๋ CPU ๋ถํ๋ฅผ ์ต์ ํ๊ธฐ ์ํจ์ด๋ผ๋ฉด Sleep() ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. ๋น๋๊ธฐ์ ์ผ๋ก ์ํ์ค์ ๋ฐ๋ผ ์ง์ฐํ๊ณ ์ถ์ ๋
์ ์ด๋ฅผ ์ํ ์ํ์ค ๋ฃจํ ๋ด์์ ๋๊ธฐํ๋ฅผ ์ํ ์ง์ฐ์ด ํ์ํ๋ค๋ฉด WaitHandle์ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ๋ถ์์ ์ ๊ธฐ์ ์ ํธ๊ฐ ์
๋ ฅ๋๋ฉด ์คํ
์ด์ง๋ฅผ ์ด๋ํด์ผ ํ๋ ์ํฉ์ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ๋ง์ฝ, ์ํ์ค ๋ฃจํ ๋ด์ Sleep()์ ์ฌ์ฉํ๋ฉด ์ง์ ๋ ์๊ฐ๋งํผ ๋ธ๋ฌํน ๋์ด ์๋ต์ด ๋ฆ์ด์ง ์ ์์ต๋๋ค. ํ์ง๋ง WaitHandle.WaitOne()์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฒคํธ๊ฐ Set์ด ๋์ด ์ฆ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ด ์์๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ํฉํ๋๋ ๋ฐ์ ธ๋ด์ผ ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก Sleep()๊ณผ WaitHandle ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ธ์ง ํ๋จํ๋ ๊ธฐ์ค์ด ๋ ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
'Programming > .Net' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[.Net] WinForm UI ์ปจํธ๋กค ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data Binding) ํํค์น๊ธฐ(์์ ํฌํจ)
[.Net] WinForm UI ์ปจํธ๋กค ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data Binding) ํํค์น๊ธฐ(์์ ํฌํจ)
2024.03.24 -
[.Net] ML.NET์ ์ด์ฉํ ๋ฅ ๋ฌ๋ ๋ชจ๋ธ ์์ฑํ๊ธฐ - ์ด๋ฏธ์ง ๋ถ๋ฅ
[.Net] ML.NET์ ์ด์ฉํ ๋ฅ ๋ฌ๋ ๋ชจ๋ธ ์์ฑํ๊ธฐ - ์ด๋ฏธ์ง ๋ถ๋ฅ
2023.10.15 -
[C#] WinForm ๋๊ตฌ ์์์ ์ปจํธ๋กค์ด ์ถ๊ฐ๋์ง ์๋ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
[C#] WinForm ๋๊ตฌ ์์์ ์ปจํธ๋กค์ด ์ถ๊ฐ๋์ง ์๋ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
2022.10.29 -
[C#] WinForm์ Form ๋์์ด๋๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
[C#] WinForm์ Form ๋์์ด๋๊ฐ ์ฌ๋ผ์ง๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
2022.10.25