Async, Await - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki
- ๋ฉ์๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๋๋ก ํ์ํ๋ ํค์๋
- async๋ก ํ์๋ ๋ฉ์๋๋ Task ๋๋ Task ๋ฐํ
- ๋ฉ์๋ ๋ด๋ถ์์ await ์ฌ์ฉ ๊ฐ๋ฅ
- ๋น๋๊ธฐ ์์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ํ์ฌ ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋๋ก ํด์ฃผ๋ ํค์๋
- await๋ async๋ก ํ์๋ ๋ฉ์๋ ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
์ด ๋ ํค์๋๋ C# 5.0๋ถํฐ ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก, Unity์์๋ C# 7.0 ์ด์์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
- Unity์์๋ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ ๋ async์ await๋ฅผ ์ฌ์ฉํ์ฌ
- ๊ฒ์์ ํ๋ ์๋ฅ ์ ์ง
- ๋คํธ์ํฌ ์์ฒญ
- ํ์ผ I/O
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๋ฑ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ
- ๋น๋๊ธฐ ๋ฉ์๋๋ async ํค์๋๋ก ์ ์ํ๊ณ , Task ๋ฐํ
- ์๋ฅผ ๋ค์ด, ์น์์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
public class Example : MonoBehaviour
{
private async void Start()
{
string data = await FetchDataAsync("https://api.example.com/data");
Debug.Log(data);
}
private async Task<string> FetchDataAsync(string url)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
{
await webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.Success)
{
return webRequest.downloadHandler.text;
}
else
{
Debug.LogError("Error: " + webRequest.error);
return null;
}
}
}
}
- await๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ๋ฉ์๋์ ์คํ ๋ธ๋กํนX
- ์ ์์ ์์ await webRequest.SendWebRequest()๋ ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง๋ง, Unity์ ๋ฉ์ธ ์ค๋ ๋๋ ๊ณ์ํด์ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Unity์์๋ ๋๋ถ๋ถ์ Unity API๊ฐ ๋ฉ์ธ ์ค๋ ๋์์๋ง ์คํ๋ ์ ์์ผ๋ฏ๋ก, ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ ์ค๋ ๋์์ ์ฒ๋ฆฌ
- async์ await๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ์คํํ ํ, ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ํ๊ฒ ์ฒ๋ฆฌ
- ๋น๋๊ธฐ ์์ ์ ํตํด ๊ธด ์๊ฐ ๋์ ๋ธ๋กํน์ด ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก, ๊ฒ์ ์ฑ๋ฅ ์ ์ง์ ๋์
- ํนํ ๋คํธ์ํฌ ์์ฒญ์ด๋ ํ์ผ I/O ๊ฐ์ ์์ ์์ ์ ์ฉ
- async์ await๋ฅผ ์ฌ์ฉํ๋ฉด CPU ์์์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉ
- I/O ์์ ์ด๋ ๋คํธ์ํฌ ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด, CPU๊ฐ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ์๊ฐ ํ๋ณด ๊ฐ๋ฅ
- ๋น๋๊ธฐ ์์ ์ async์ await๋ก ๊ตฌํํ๋ฉด, ์ฝ๋ฐฑ ๊ธฐ๋ฐ์ ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ ํํผ
- ์ฝ๋๊ฐ ๋ณด๋ค ์ง๊ด์ ์ด๊ณ ๊ฐ๋ ์ฑ ์ข์