*๋๊ธฐ: ์ผ์ ์ฃผ๊ณ ๊ทธ ์ผ์ด ๋๋ ๋๊น์ง ์๋ฌด๊ฒ๋ ์ํ๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ. ex) ๋งคํ์ ์ค
*๋น๋๊ธฐ: ์ผ์ ์ค ํ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ด ์ผ์ ํ๋ ๊ฒ. ex) ์ปคํผ์ ์ง๋๋ฒจ
#๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์์
using System;
public class TestClass {
static void Main(string[] args) {
PrintNumber();
PrintStart();
Console.ReadKey();
}
private static void PrintNumber() {
for(int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
}
private static void PrintStart() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("*");
}
}
}
0 1 2 3 4 ... * * * * ... |
PrintNumber(), PrintStart() ํจ์๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
#๋น๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ(Thread)์ ์์
using System;
using System.Threading;
public class TestClass {
static void Main(string[] args) {
var thread1 = new Thread(PrintNumber);
thread1.Start();
var thread2 = new Thread(PrintStart);
thread2.Start();
Console.ReadKey();
}
private static void PrintNumber() {
for(int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
}
private static void PrintStart() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("*");
}
}
}
0 * 1 * 2 * ... |
PrintNumber(), PrintStart() ํจ์๊ฐ ๋์์ ์คํ๋๋ค.
*Thread์ ๋ฌธ์ ์
Thread ๋ return ๊ฐ์ด ์๋ class ์ด๋ค. (๊ธฐ๋ฅ์ด ๋งค์ฐ ํ์ ์ )
Thread ์ ์ข ๋ฃ์์ ์ ์ ์ ์๋ค.
Thread ๋ ์ทจ์/์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
Thread๋ 1MB ๋ก ์๋นํ ๋ฌด๊ฑฐ์ด ๊ฐ์ฒด์ด๋ค.
์์ฑํ ๋๋ง๋ค ์ฐธ์กฐ๋์ด ์๋ ๋ชจ๋ DLL ์ ๋๋ฉด์ ๊ณต๊ฐํ ๋น์ ์์ฒญํ๋ค.
Thread์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ๊ฒ Task !
Thread pool๋ก ๋ถํฐ Thread๋ฅผ ๊ฐ์ ธ์์ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ค.
Task Chain ๊ฐ๋ ์ด ๋์ ๋์ด ์ฌ๋ฌ Thread ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋์ํ๊ฒ ํ๋ค.
Task ๋ฐํ๊ฐ ์์ async ํค์๋๋ฅผ ๋ถ์ธ๋ค.
๋๊ธฐ๊ฐ ํ์ํ๋ฉด(๋๊ธฐ์ฒ๋ผ) await ํค์๋๋ฅผ ์ฌ์ฉํ์. ๋ฉ์๋๋ ์ ์ ์ค๋จ๋๊ณ ํ๋ก๊ทธ๋จ์ ๊ณ์ ์งํํ๋ค.
Task ์ ๋ฐํ๊ฐ์ void, Task, Task<T> ์ ์ค์ ํ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
# Task ์์ 1) Action
public class TestClass : MonoBehaviour {
private void Start() {
Task task1 = new Task(PrintNumber);
task1.Start();
Task task2 = new Task(PrintStart);
task2.Start();
}
private void PrintNumber() {
for (int i = 0; i < 10; i++) {
Debug.Log(i);
}
}
private void PrintStart() {
for (int i = 0; i < 10; i++) {
Debug.Log("*");
}
}
}
Thread ๋ฅผ Task ๋ก๋ง ๋ฐ๊ฟจ๊ณ ๋น๋๊ธฐ๋ก ์ ์คํ๋๋ ๋ชจ์ต์ด๋ค.
public class TestClass : MonoBehaviour {
private void Start() {
Task.Run(PrintNumber);
Task.Run(PrintStart);
}
private void PrintNumber() {
for (int i = 0; i < 10; i++) {
Debug.Log(i);
}
}
private void PrintStart() {
for (int i = 0; i < 10; i++) {
Debug.Log("*");
}
}
}
์ธ์๊ฐ ์๋ ๋ฉ์๋๋ผ๋ฉด Task.Run(ํจ์๋ช ) ๋ก ๊ฐ๋จํ ๋ถ๋ฅผ ์๋ ์๋ค.
public class TestClass : MonoBehaviour {
private void Start() {
Task.Run(() => PrintNumber());
Task.Run(() => PrintStart());
}
private void PrintNumber() {
for (int i = 0; i < 5; i++) {
Debug.Log(i);
}
}
private void PrintStart() {
for (int i = 0; i < 5; i++) {
Debug.Log("*");
}
}
}
๋๋ค์ ํํ์ ์์ ๊ฐ๋ค.
# Task ์์ 2) Task<T>
public class TestClass : MonoBehaviour {
private void Start() {
Task<int> task = new Task<int>(GetResult);
task.Start();
Debug.Log(task.Result); // ๊ฒฐ๊ณผ๊ฐ ๋๊ธฐ
Task.Run(() => PrintNumber());
Task.Run(() => PrintStar());
}
private void PrintNumber() {
for (int i = 0; i < 5; i++) {
Debug.Log(i);
}
}
private void PrintStar() {
for (int i = 0; i < 5; i++) {
Debug.Log("*");
}
}
private int GetResult() {
for (int i = 0; i < 5; i++) {
Debug.Log("/");
}
return 1;
}
}
Task ๋ก ๋ฃ์ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ ์๋๋ฐ task.Result ๊ตฌ๋ฌธ์ ํด๋น ์์น์์ ๊ฒฐ๊ณผ๊ฐ์ ๋๊ธฐํ๊ฒ ๋๋ค.
ํด๋น ํจ์ ์์ ์ดํ ํ๋์ ๋ฃ์ผ๋ฉด ๋น๋๊ธฐ์์ผ๋ก ์ ํ์ฉํ ์ ์์๋ฏ.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;
public class Example : MonoBehaviour
{
int number = 0;
private void Start() {
Task.Run(() => Testing());
}
async Task Testing() {
await Task.Run(() => {
while(number < 50) {
number++;
}
});
await Task.Delay(5000);
}
}
Task ๋ ๊ฐ์ ๋ฐํํ์ง ์๋ ๋น๋๊ธฐ ์์ ,
Task<TResult>๋ ๊ฐ์ ๋ฐํํ ์ ์๋ ๋น๋๊ธฐ ์์ ์ด๋ค.
๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ๋ถ๋ถ์ await ์ฐ์ฐ์๋ฅผ ์ ์ฉํด์ค๋ค.
P.S) Coroutine ์ ๋น๋๊ธฐ์ผ๊น?
ํ๋ ์์ ํ๋ฆ์ ๋๊ฒจ์ฃผ๋ฉฐ ์๋ฒฝํ ๋น๋๊ธฐ ๋ฐฉ์์ด ์๋ ํ๋ ์์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
null, WaitForSecond, WaitForFixedUpdate, WaitForEndOfFrame, WaitUntil ๋ฑ ์๊ฐ์ ๋ฐ๋ผ ๋๊ธฐํ๋ ๋ฐฉ์์ด๋ค.
async/await ์์ ์ฐจ์ด์ ์ return ๊ฐ์ ๋ฐ์ ์ ์๋ ์๋์ ์ฐจ์ด. ์ํฉ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค.
using System;
using System.Collections;
class Program {
public IEnumerator Coroutine() {
int i = 0;
Console.WriteLine($"Coroutine {++i}");
yield return null;
Console.WriteLine($"Coroutine {++i}");
yield return null;
Console.WriteLine($"Coroutine {++i}");
yield return null;
}
static void Main(string[] args) {
Program program = new Program();
IEnumerator coroutine = program.Coroutine();
Console.WriteLine("Main 1");
coroutine.MoveNext();
Console.WriteLine("Main 2");
coroutine.MoveNext();
Console.WriteLine("Main 3");
coroutine.MoveNext();
}
}
// OUTPUT :
// Main 1
// Coroutine 1
// Main 2
// Coroutine 2
// Main 3
// Coroutine 3
์ถ์ฒ: https://kukuta.tistory.com/371
'๐ฎ Unity Study > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C#] Hash ? (0) | 2023.08.17 |
---|---|
[C#] lambda์์ด๋ ? ์ธ์ ์ฌ์ฉํ ๊น ? (0) | 2023.08.17 |
[C#] Action ๊ณผ Func (feat. Delegate, callback) (0) | 2023.08.16 |
[C#] List ๊ฐ์ Enumerable ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ ํจ์๋ค (0) | 2023.04.26 |
C# Code Convention (0) | 2022.10.13 |