Thread
동시에 실행되는 것처럼 보이지만 병렬적으로 작동
using System.Threading
Thread 스레드명 = new Thread(함수명);
스레드명.Start(); // 스레드
스레드명.Join(); // 해당 스레드가 끝날때까지 대기
static object lockObject = new object();
lock (lockObject)
{
// 여기선 현재 스레드만 실행되고 다른 스레드가 실행되지 않음
}
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
namespace WindowsFormsApp6
{
public partial class Form1 : Form
{
//현재 몇 명이 도착했는지
static int sharedData = 0;
public Form1()
{
InitializeComponent();
//각 차량의 스레드 생성, 파라미터를 주기 위한 코드
Thread car1 = new Thread(new ParameterizedThreadStart(car_t));
Thread car2 = new Thread(new ParameterizedThreadStart(car_t));
Thread car3 = new Thread(new ParameterizedThreadStart(car_t));
Thread car4 = new Thread(new ParameterizedThreadStart(car_t));
Thread car5 = new Thread(new ParameterizedThreadStart(car_t));
//background는 프로그램 종료 시, 스레드가 살아있지 못하게
car1.IsBackground = true;
car1.Start("car1");
car2.IsBackground = true;
car2.Start("car2");
car3.IsBackground = true;
car3.Start("car3");
car4.IsBackground = true;
car4.Start("car4");
car5.IsBackground = true;
car5.Start("car5");
}
//async는 await Task.Delay라는 비동기식 코드가 있다는 것을 의미함
async void car_t(object name)
{
//랜덤 변수를 스레드마다 다르게 생성하기 위해
Random rnd = new Random(Guid.NewGuid().GetHashCode());
int sec = rnd.Next(1000);
//걸린시간을 측정
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 10; i++)
{
await Task.Delay(sec);
}
stopwatch.Stop();
//몇 명이 도착했는지 알기 위해
sharedData++;
//출력
textBox1.Text += $"{sharedData}등 {name} 도착, 딜레이 : {sec}, 걸린시간 : " + stopwatch.Elapsed + "\r\n";
//모두 도착 시 레이스 종료
if (sharedData == 5)
{
textBox1.Text += "레이스 종료";
}
}
}
}