[RUST/COMMON] sleep 함수 : 쓰레드 대기하기
■ sleep 함수를 사용해 쓰레드를 대기하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 |
use std::thread; use std::time; thread::sleep(time::Duration::from_millis(1000)); |
■ sleep 함수를 사용해 쓰레드를 대기하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 |
use std::thread; use std::time; thread::sleep(time::Duration::from_millis(1000)); |
■ Dispatcher 클래스의 Run 정적 메소드를 사용해 다중 윈도우 다중 스레드를 사용하는 방법을 보여준다. 이 메소드는 새 스레드의 시작점이다. 이 스레드의 제어하에
■ 일기 예보를 검색하는 원격 프로시저 호출을 모방한다. 별도의 작업자 스레드를 사용하여 이 호출을 실행하고 완료되면 UI 스레드의 Dispatcher에서 업데이트 메소드를 예약한다.
■ DispatcherObject 클래스의 Dispatcher 속성을 사용해 장기 실행 계산이 포함된 단일 스레드 애플리케이션 만드는 방법을 보여준다. ▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestProject" Width="800" Height="600" FontFamily="나눔고딕코딩" FontSize="16"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <Button Name="startButton" Width="100" Height="30" Content="Start" /> <StackPanel Margin="0 30 0 0" Orientation="Horizontal"> <TextBlock> Biggest Prime Found : </TextBlock> <TextBlock Name="bigPrimeTextBlock" Margin="10 0 0 0"> 3 </TextBlock> </StackPanel> </StackPanel> </Window> |
▶ MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
using System; using System.Diagnostics; using System.Windows; using System.Windows.Threading; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate ////////////////////////////////////////////////////////////////////////////////////////// Public #region 다음 소수 대리자 - NextPrimeDelegate() /// <summary> /// 다음 소수 대리자 /// </summary> public delegate void NextPrimeDelegate(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 계산 계속 여부 /// </summary> private bool continueCalculating; /// <summary> /// 소수가 아닌 경우 /// </summary> private bool notPrime; /// <summary> /// 숫자 /// </summary> private long number = 3; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); this.startButton.Click += startButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region Start 버튼 클릭시 처리하기 - startButton_Click(sender, e) /// <summary> /// Start 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void startButton_Click(object sender, EventArgs e) { if(this.continueCalculating) { this.continueCalculating = false; this.startButton.Content = "Resume"; } else { this.continueCalculating = true; this.startButton.Content = "Stop"; this.startButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber)); } } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 다음 숫자 체크하기 - CheckNextNumber() /// <summary> /// 다음 숫자 체크하기 /// </summary> public void CheckNextNumber() { this.notPrime = false; for(long i = 3; i <= Math.Sqrt(this.number); i++) { if(this.number % i == 0) { this.notPrime = true; break; } } if(!this.notPrime) { this.bigPrimeTextBlock.Text = this.number.ToString(); } this.number += 2; if(this.continueCalculating) { this.startButton.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, new NextPrimeDelegate(CheckNextNumber)); } } #endregion } } |
■ Thread 클래스의 CurrentThread 정적 속성을 사용해 특정 문화권을 설정하는 방법을 보여준다. ▶ MainApplication.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Globalization; using System.Threading; using System.Windows; namespace TestProject { /// <summary> /// 메인 애플리케이션 /// </summary> public partial class MainApplication : Application { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainApplication() /// <summary> /// 생성자 /// </summary> public MainApplication() { CultureInfo cultureInfo = new CultureInfo("fr-CA"); Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; } #endregion } } |
■ Process 클래스를 사용해 부모 프로세스 종료시 자식 프로세스를 종료시키는 방법을 보여준다. ▶ JobObjectInfoType.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
namespace TestProject; /// <summary> /// 작업 객체 정보 타입 /// </summary> public enum JobObjectInformationType { /// <summary> /// Associate Completion Port Information /// </summary> AssociateCompletionPortInformation = 7, /// <summary> /// Basic Limit Information /// </summary> BasicLimitInformation = 2, /// <summary> /// Basic UI Restrictions /// </summary> BasicUIRestrictions = 4, /// <summary> /// End Of Job Time Information /// </summary> EndOfJobTimeInformation = 6, /// <summary> /// Extended Limit Information /// </summary> ExtendedLimitInformation = 9, /// <summary> /// Security Limit Information /// </summary> SecurityLimitInformation = 5, /// <summary> /// Group Information /// </summary> GroupInformation = 11 } |
▶ JobObjectLimit.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
namespace TestProject; /// <summary> /// 작업 객체 제한 /// </summary> [Flags] public enum JobObjectLimit : uint { /// <summary> /// Job Object Limit Kill On Job Close /// </summary> JobObjectLimitKillOnJobClose = 0x2000 } |
▶ IO_COUNTERS.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System.Runtime.InteropServices; namespace TestProject; /// <summary> /// IO 카운트 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct IO_COUNTERS { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 읽기 연산 카운트 /// </summary> public ulong ReadOperationCount; /// <summary> /// 쓰기 연산 카운트 /// </summary> public ulong WriteOperationCount; /// <summary> /// 기타 연산 카운트 /// </summary> public ulong OtherOperationCount; /// <summary> /// 읽기 전송 카운트 /// </summary> public ulong ReadTransferCount; /// <summary> /// 쓰기 전송 카운트 /// </summary> public ulong WriteTransferCount; /// <summary> /// 기타 전송 카운트 /// </summary> public ulong OtherTransferCount; #endregion } |
▶
■ 64비트 프로세스 여부와 64비트 운영 체제 여부를 구하는 방법을 보여준다. ▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using System.Diagnostics; using System.Runtime.InteropServices; namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Import ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region WOW 64비트 프로세스 여부 구하기 - IsWow64Process(processHandle, isWOW64Process) /// <summary> /// WOW 64비트 프로세스 여부 구하기 /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="isWOW64Process">WOW 64비트 프로세스 여부</param> /// <returns>처리 결과</returns> [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsWow64Process([In] IntPtr processHandle, [Out] out bool isWOW64Process); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 64비트 버전 여부 구하기 - Is64BitVersion() /// <summary> /// 64비트 버전 여부 구하기 /// </summary> /// <returns>64비트 버전 여부</returns> private static bool Is64BitVersion() { if((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6) { using(Process process = Process.GetCurrentProcess()) { bool result; if(!IsWow64Process(process.Handle, out result)) { return false; } return result; } } else { return false; } } #endregion #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { bool is64BitProcess = (IntPtr.Size == 8); bool is64BitOperatingSystem = is64BitProcess || Is64BitVersion(); Console.WriteLine($"64비트 프로세스 여부 : {is64BitProcess }"); Console.WriteLine($"64비트 운영 체제 여부 : {is64BitOperatingSystem}"); } #endregion } |
TestProject.zip
■ ISynchronizeInvoke 인터페이스를 사용해 InvokeRequired 코드 패턴을 자동화하는 방법을 보여준다. ▶ SynchronizeInvokeExtension.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System.ComponentModel; namespace TestProject; /// <summary> /// 호출 동기화 확장 /// </summary> public static class SynchronizeInvokeExtension { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 필요시 호출하기 - InvokeIfRequired<TTarget>(targetObject, action) /// <summary> /// 필요시 호출하기 /// </summary> /// <typeparam name="TTarget">타겟 객체 타입</typeparam> /// <param name="targetObject">타겟 객체</param> /// <param name="action">액션</param> public static void InvokeIfRequired<TTarget>(this TTarget targetObject, Action<TTarget> action) where TTarget : ISynchronizeInvoke { if(targetObject.InvokeRequired) { targetObject.Invoke(action, new object[] { targetObject }); } else { action(targetObject); } } #endregion #region 필요시 호출하기 - InvokeIfRequired<TTarget, TResult>(targetObject, function) /// <summary> /// 필요시 호출하기 /// </summary> /// <typeparam name="TTarget">타겟 객체 타입</typeparam> /// <typeparam name="TResult">결과 타입</typeparam> /// <param name="targetObject">타겟 객체</param> /// <param name="function">함수</param> /// <returns>처리 결과</returns> public static TResult InvokeIfRequired<TTarget, TResult>(this TTarget targetObject, Func<TTarget, TResult> function) where TTarget : ISynchronizeInvoke { return targetObject.InvokeRequired ? (TResult)targetObject.Invoke(function, new object[] { targetObject }) : function(targetObject); } #endregion } |
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.runButton.Click += runButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 실행 버튼 클릭시 처리하기 - runButton_Click(sender, e) /// <summary> /// 실행 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void runButton_Click(object sender, EventArgs e) { Button button = sender as Button; button.Enabled = false; Thread thread = new Thread(new ThreadStart(ProcessThread)); thread.Start(); } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 스레드 처리하기 - ProcessThread() /// <summary> /// 스레드 처리하기 /// </summary> private void ProcessThread() { for(int i = 0; i < 10; i++) { this.InvokeIfRequired((form) => { this.messageLabel.Text = (i + 1).ToString(); }); Thread.Sleep(500); } this.InvokeIfRequired ( (form) => { this.messageLabel.Text = string.Empty; this.runButton.Enabled = true; } ); } #endregion } } |
TestProject.zip
■ MethodInvoker 대리자를 사용해 InvokeRequired 코드 패턴을 자동화하는 방법을 보여준다. ▶ ControlExtension.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace TestProject; /// <summary> /// 컨트롤 확장 /// </summary> public static class ControlExtension { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 필요시 호출하기 - InvokeIfRequired(control, methodInvoker) /// <summary> /// 필요시 호출하기 /// </summary> /// <param name="control">컨트롤</param> /// <param name="methodInvoker">메소드 호출자</param> public static void InvokeIfRequired(this Control control, MethodInvoker methodInvoker) { if(control.InvokeRequired) { control.Invoke(methodInvoker); } else { methodInvoker(); } } #endregion } |
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.runButton.Click += runButton_Click; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 실행 버튼 클릭시 처리하기 - runButton_Click(sender, e) /// <summary> /// 실행 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void runButton_Click(object sender, EventArgs e) { Button button = sender as Button; button.Enabled = false; Thread thread = new Thread(new ThreadStart(ProcessThread)); thread.Start(); } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 스레드 처리하기 - ProcessThread() /// <summary> /// 스레드 처리하기 /// </summary> private void ProcessThread() { for(int i = 0; i < 10; i++) { this.InvokeIfRequired(() => { this.messageLabel.Text = (i + 1).ToString(); }); Thread.Sleep(500); } this.InvokeIfRequired ( () => { this.messageLabel.Text = string.Empty; this.runButton.Enabled = true; } ); } #endregion } } |
TestProject.zip
■ Process 클래스를 사용하는 기본적인 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import multiprocessing import time def run(name, lock, countValue): print(name, "프로세스가 생성되었습니다.") tryCount = 0 while 1: lock.acquire() if countValue.value > 0: countValue.value -= 1 lock.release() tryCount += 1 time.sleep(0.1) else: lock.release() print(name, "tryCount", tryCount) break if __name__ == "__main__": lock = multiprocessing.Lock() countValue = multiprocessing.Value("i", 10) processList = [] for processName in ["프로세스1", "프로세스2", "프로세스3"]: process = multiprocessing.Process(target = run, args = (processName, lock, countValue)) processList.append(process) process.start() for process in processList: process.join() print("모든 프로세스가 종료되었습니다.") """ 프로세스1 프로세스가 생성되었습니다. 프로세스2 프로세스가 생성되었습니다. 프로세스3 프로세스가 생성되었습니다. 프로세스2 tryCount 3 프로세스1 tryCount 3 프로세스3 tryCount 4 모든 프로세스가 종료되었습니다. """ |
■ Lock 클래스의 acquire/release 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import threading import time count = 10 lock = threading.Lock() class Developer(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name self.fixed = 0 def run(self): global count while True: lock.acquire() if count > 0: count -= 1 lock.release() self.fixed += 1 time.sleep(0.1) else: lock.release() break developerList = [] for name in ["스레드1", "스레드2", "스레드3"]: devloper = Developer(name) developerList.append(devloper) devloper.start() for devloper in developerList: devloper.join() print(devloper.name, "fixed", devloper.fixed) """ 스레드1 fixed 3 스레드2 fixed 4 스레드3 fixed 3 """ |
■ execle 함수를 사용해 새 프로그램을 실행해 현재 프로세스를 대체하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 |
import os os.execle("C:\Program Files\Python310\python.exe", "python", "-v", {"HOME" : "c:\\"}) |
■ execl 함수를 사용해 새 프로그램을 실행해 현재 프로세스를 대체하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 |
import os os.execl("C:\Program Files\Python310\python.exe", "python", "-v") |
■ execv 함수를 사용해 새 프로그램을 실행해 현재 프로세스를 대체하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 |
import os os.execv("C:\Program Files\Python310\python.exe", ("python", "-v")) |
■ popen 함수를 사용해 자식 프로세스에서 파이썬 스크립트를 동적 실행하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 |
import os os.putenv("test", "\\temp\\test") wrapClose = os.popen('''python -c "import os;print(os.getenv('test'))"''', "r") resultString = wrapClose.read() print(resultString) |
■ getpid 함수를 사용해 현재 프로세스 ID를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 |
import os processID = os.getpid() print(processID) """ 16516 """ |
■ fdopen 함수를 사용하는 기본적인 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 |
import os readFileDescriptor, writeFileDescriptor = os.pipe() textIOWrapper = os.fdopen(readFileDescriptor) |
■ Process 클래스를 사용해 크롬 브라우저에서 특정 사이트를 구글에서 검색하는 방법을 보여준다. ▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System.Diagnostics; namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { string site = "icodebroker.tistory.com"; string keyword = "maui"; Process process = new Process(); process.StartInfo.FileName = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"; process.StartInfo.Arguments = $"--profile-directory=\"Profile 6\" \"https://www.google.com/search?q=site:{site} {keyword}\""; process.Start(); } #endregion } |
TestProject.zip
■ Process 클래스를 사용해 크롬 브라우저에서 구글 검색을 하는 방법을 보여준다. ▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System.Diagnostics; namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { string keyword = "DevExpress GridControl 클래스"; Process process = new Process(); process.StartInfo.FileName = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"; process.StartInfo.Arguments = $"--profile-directory=\"Profile 6\" \"https://www.google.com/search?q={keyword}\""; process.Start(); } #endregion } |
TestProject.zip
■ Task 클래스를 사용해 완료된 작업을 만드는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Threading.Tasks; #region 완료된 태스크 구하기 - GetCompletedTask() /// <summary> /// 완료된 태스크 구하기 /// </summary> /// <returns>태스크</returns> public Task GetCompletedTask() { return new Task(() => { }); } #endregion |
■ Task 클래스의 FromResult 정적 메소드를 모방하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Threading.Tasks; #region 작업 결과 구하기 - FromResult<TResult>(resultValue) /// <summary> /// 작업 결과 구하기 /// </summary> /// <typeparam name="TResult">결과 타입</typeparam> /// <param name="resultValue">결과 값</param> /// <returns>작업 결과</returns> public Task<TResult> FromResult<TResult>(TResult resultValue) { TaskCompletionSource<TResult> source = new TaskCompletionSource<TResult>(); source.SetResult(resultValue); return source.Task; } #endregion |
■ Task 클래스의 FromResult 정적 메소드를 사용해 완료된 작업을 만드는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System.Threading.Tasks; /// <summary> /// 완료된 태스크 /// </summary> private static Task _completedTask = Task.FromResult(false); #region 완료된 태스크 구하기 - GetCompletedTask() /// <summary> /// 완료된 태스크 구하기 /// </summary> /// <returns>태스크</returns> public static Task GetCompletedTask() { return _completedTask; } #endregion |
■ Task 클래스의 CompletedTask 정적 속성을 사용해 완료된 작업을 만드는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 |
using System.Threading.Tasks; Task completedTask = Task.CompletedTask; |
■ Task 클래스 : WhenAll 정적 메소드를 사용해 모든 태스크 작업 완료를 대기하는 방법을 보여준다. ▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private async static Task Main() { string[] sourceArray = new string[] { "London", "New York", "Paris", "Seoul", "Tokyo" }; List<Task> taskList = new List<Task>(); foreach(string source in sourceArray) { taskList.Add ( Task.Run ( async () => { await Task.Delay(1000); Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {source}"); } ) ); } await Task.WhenAll(taskList); } #endregion } |
TestProject.zip
■ Parallel 클래스의 ForEach 정적 메소드를 Task 클래스 Start 메소드에서 사용하는 방법을 보여준다. ▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private async static Task Main() { string[] stringArray = new string[] { "London", "New York", "Paris", "Seoul", "Tokyo" }; await Task.Run ( () => Parallel.ForEach ( stringArray, async s => { await Task.Delay(1000); Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {s}"); } ) ); Console.ReadKey(false); } #endregion } |
TestProject.zip