[C#] async/await

[์›๋ณธ ๋งํฌ]

๊ทธ๊ฑฐ ์•„๋Š”๊ฐ€?
์šฐ๋ฆฌ๊ฐ€ Nodejs ๋“ฑ์—์„œ ํ”ํžˆ๋“ค ์‚ฌ์šฉํ•˜๋Š” async/await ์‹ ํƒ์Šค๋Š” ๋‹ท๋„ท์—์„œ ์ฒ˜์Œ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒƒ์ด๋‹ค.

์„ ๊ตฌ์ž์ธ ๋งŒํผ, C#๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์žˆ์–ด์„œ๋Š” ๋›ฐ์–ด๋‚œ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค.

async/await์€ 2012๋…„ 8์›”, C# 5.0๋ถ€ํ„ฐ ์ง€์›๋˜์—ˆ๋‹ค.
์–ด์ง€๊ฐ„ํ•œ ๋ ˆ๊ฑฐ์‹œ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ฉด ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค.




TPL

C#์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„์€ Task Parallel Library(TPL)๋ผ๋Š” ๋…€์„์ด ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋Š” ๊ทธ๋ฆฌ ํŠน๋ณ„ํ•œ๊ฑด ์—†๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œํ’€์„ ๋‘๊ณ , ๊ฑฐ๊ธฐ์—๋‹ค๊ฐ€ ํƒœ์Šคํฌ๋ฅผ ์˜ฌ๋ ค์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Task๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ async/await์„ ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์€ ์ „๋ถ€ TPL์— ์˜ฌ๋ผ๊ฐ€๊ณ , TPL์— ์˜ํ•ด ์ œ์–ด๋œ๋‹ค.

๊ฐ„๋‹จํ•œ ๋กœ์ง์„ TPL์„ ํ†ตํ•ด ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋Ÿฐ์‹์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Run์— ํƒœ์Šคํฌ๋กœ ์‹คํ–‰์‹œํ‚ฌ ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ทผ๋ฐ ๋ญ ์ด๊ฒŒ ๋์ด๋ผ๋ฉด ์ด๊ฑธ ์“ธ ์ด์œ ๊ฐ€ ์—†๋‹ค.

Task ์‹œ์Šคํ…œ์˜ ๊ฐ•์ ์€ async/await์„ ์ด์šฉํ•œ ์ˆœ์ฐจ์ ์ธ ๋น„๋™๊ธฐ ํ•ธ๋“ค๋ง์—์„œ ๋‚˜์˜จ๋‹ค.

Javascript์˜ Promise&async/await์ด๋‚˜ python์˜ asyncio/async ๋“ฑ์„ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด ๊ทธ ํŽธ๋ฆฌํ•จ์„ ์ด๋ฏธ ์ž˜ ์•Œ ๊ฒƒ์ด๋‹ค.




async/await

C#์—์„œ async/await์˜ ์ œํ•œ์‚ฌํ•ญ์€ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

  1. await ๋ฌธ์€ async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. await๋Š” ํ•ด๋‹น Task๊ฐ€ ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

  3. async๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Œ์„ ๋œปํ•˜๋ฉฐ, ๋ณดํ†ต์€ Task๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. Main ํ•จ์ˆ˜๋„ async Task์˜ ์‹œ๊ทธ๋„ˆ์ฒ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. (since C# 7.1)



๋งŒ์•ฝ Javascript์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ด๋จธ ์‹คํ–‰ ํ•จ์ˆ˜์ธ "setTimeout"์„ C#์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”œ๋ ˆ์ด๋กœ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋Œ€๊ธฐํ–ˆ๋‹ค๊ฐ€, ์ „๋‹ฌ๋ฐ›์€ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
1์ดˆ ํƒ€์ด๋จธ์™€ 2์ดˆ ํƒ€์ด๋จธ๋ฅผ ๋“ฑ๋กํ•ด๋ดค๋‹ค.

์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ํƒ€์ด๋จธ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊บผ์ง€์ง€ ๋ง๋ผ๊ณ  ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋ฐ•์•„๋†จ๋Š”๋ฐ, await๊ณผ WhenAll ๋“ฑ์˜ ๊ทธ๋ฃจํ•‘ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข€๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
Javascript์˜ Promise.all๊ณผ ๋™์น˜๋‹ค.

์ž˜ ๋ˆ๋‹ค.




Task์™€ Task

์œ„์—์„œ ์ผ๋˜ Task๋Š” void ๋ฆฌํ„ด ๋ฒ„์ „์ด๊ณ , ๋ญ”๊ฐ€ ๊ฐ’์„ ๋ฐ›์•„์„œ ์“ธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด Task ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์•„๋ž˜๋Š” int ๋ง์…ˆ ํ•จ์ˆ˜๋ฅผ async ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋‹ค.

๋ณ„๋‹ค๋ฅผ๊ฑด ์—†๋‹ค.



์ฐธ์กฐ
TPL(์ž‘์—… ๋ณ‘๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) | Microsoft Learn
.NET์˜ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์„ค๋ช…์„œ ๊ฐ€์ด๋“œ | Microsoft Learn
๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - C# | Microsoft Learn