AsyncAwaitBestPractices ์†Œ๊ฐœ

AsyncAwaitBestPractices๋Š”

John Thiriet๋‹˜์˜ ์•„๋ž˜ ๊ธ€

์— ์˜๊ฐ์„ ๋ฐ›์•„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜๋ฉฐ System.Threading.Tasks.Task ๋ฐ System.Threading.Tasks.ValueTask์˜ ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

async/await์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‘๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝํ•ฉ ์กฐ๊ฑด ์ƒ์„ฑ / ๋™์‹œ ์‹คํ–‰ (์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์ฝ”๋”ฉํ–ˆ์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ)
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ˆ์™ธ๋ฅผ ์ธ์‹ํ•˜์ง€๋งŒ ์ฝ”๋”๋Š” ์˜ˆ์™ธ๋ฅผ ๋ณผ ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ ์ƒ์„ฑ (ํŠนํžˆ ์‹ค์ˆ˜๋กœ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝํ•ฉ ์กฐ๊ฑด์„ ๋„์ž…ํ•œ ๊ฒฝ์šฐ ๋””๋ฒ„๊ทธ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€)

9๊ฐœ์˜ ์ข‹์•„์š”

๋ฉ”์„œ๋“œ ๋ช…์ด ์žฌ๋ฐŒ๋„ค์š” ใ…Žใ…Ž
SafeFireAndForget ์ด๋ผ๋‹ˆโ€ฆ

2๊ฐœ์˜ ์ข‹์•„์š”

ํฅ๋ฏธ๋กญ๋„ค์š”.

์ €์ž๊ฐ€ ๋ง ํ–ˆ๋“ฏ์ด async๋ฅผ ๋ถ™์ธ ํ•จ์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ async๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์ฃ . ๊ทธ๋ ‡๊ฒŒ ๊ณ„์† ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ด€๊ณ„๋ฅผ ๋”ฐ๋ผ๊ฐ€๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ€๋Š” Task๋กœ ๋ฆฌํ„ดํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์„ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„์ฃผ ํ”ํ•œ ๊ฒฝ์šฐ๋กœ Event handler๊ฐ€ ์žˆ์ฃ . ์ด๋Ÿฐ ๊ฒฝ์šฐ async void๋ฅผ ์“ธ ์ˆ˜ ๋ฐ–์— ์—†์–ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฑธ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Event handler์•ˆ์—์„œ ํ˜ธ์ถœ ๋˜๋Š” async ํ•จ์ˆ˜์— ๋Œ€ํ•ด await๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ 
async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ async void๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ–ˆ๋„ค์š”

์ €์ž๊ฐ€ ์ž‘์„ฑํ•œ 'FireAndForgetSafeAsyncโ€™ํ•จ์ˆ˜๋Š” ์ด๋Ÿฐ๊ฒฝ์šฐ ์“ธ๋งŒํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ๊ธ€ ๊ณต์œ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

5๊ฐœ์˜ ์ข‹์•„์š”