[.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
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
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
์ ๋ฆฌ
๊ฐ ์ง์ฐ ํจ์์ ์ธ์๋ก ๋ฐ๋ฆฌ๋ฏธํฐ ์๊ฐ์ ๋ฃ์ด ์ฌ์ฉํ๋ค๋ ์ธก๋ฉด์์๋ ๋ชจ๋ ๋์์ด ๋์ผํด ๋ณด์ ๋๋ค. ๊ทธ๋ผ ์ด๋ ์ํฉ์์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋ ๊ฑธ๊น์?
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