.NET: เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš multithreading เปเบฅเบฐ asynchrony. เบžเบฒเบเบ—เบต 1

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบžเบดเบกโ€‹เป€เบœเบตเบโ€‹เปเบœเปˆโ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบš Habr, เบเบฒเบ™โ€‹เปเบ›โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบžเบตเบกโ€‹เบกเบฒโ€‹เปƒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบชเบฑเบ” blog post.

เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡ asynchronously, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบซเบผเบทเบเบฒเบ™เปเบšเปˆเบ‡เบงเบฝเบเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบซเบผเบฒเบเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™, เบกเบตเบขเบนเปˆเบเปˆเบญเบ™เบเบฒเบ™เบกเบฒเบ‚เบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบต. เบ”เป‰เบงเบเบเบฒเบ™เบกเบฒเป€เบ–เบดเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ™เบตเป‰เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบซเบผเบฒเบ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เปƒเบ™เบ›เบต 2019, เบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบžเบดเบกเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบขเบนเปˆเปƒเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‚เบ™เบ”เบšเบธเบเบ—เบตเปˆเบกเบตเป‚เบ›เป€เบŠเบ”เป€เบŠเบต Intel Core 8-core, เป€เบŠเบดเปˆเบ‡เบกเบตเบซเบผเบฒเบเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบฎเป‰เบญเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบฐเบซเบ™เบฒเบ™, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเบผเบฒเบเบเบฐเบ—เบนเป‰. เบขเบนเปˆเปƒเบเป‰เป†, เบกเบตเป‚เบ—เบฅเบฐเบชเบฑเบšเบ—เบตเปˆเบ‚เบตเป‰เบฎเป‰เบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบ, เบŠเบทเป‰เบชเบญเบ‡เบชเบฒเบกเบ›เบตเบเปˆเบญเบ™, เบกเบฑเบ™เบกเบตเป‚เบ›เป€เบŠเบ”เป€เบŠเบต 8-core เบขเบนเปˆเป€เบ—เบดเบ‡เป€เบฎเบทเบญ. เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบปเบงเบ‚เปเป‰เปเบกเปˆเบ™เป€เบ•เบฑเบกเป„เบ›เบ”เป‰เบงเบเบšเบปเบ”เบ„เบงเบฒเบกเปเบฅเบฐเบงเบดเบ”เบตเป‚เบญเบ—เบตเปˆเบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบŠเบปเบกเป€เบŠเบตเบเป‚เบ—เบฅเบฐเบชเบฑเบšเบชเบฐเบซเบผเบฒเบ” flagship เปƒเบ™เบ›เบตเบ™เบตเป‰เบ—เบตเปˆเบกเบตเป‚เบ›เป€เบŠเบ”เป€เบŠเบต 16-core. MS Azure เบชเบฐเปœเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบชเบฐเป€เปเบทเบญเบ™เบเบฑเบšเป‚เบ›เป€เบŠเบ”เป€เบŠเบต 20 core เปเบฅเบฐ RAM 128 TB เปƒเบ™เบฅเบฒเบ„เบฒเบ•เปเปˆเบฒเบเบงเปˆเบฒ $2/เบŠเบปเปˆเบงเป‚เบกเบ‡. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเบฐเบเบฑเบ”เบชเบนเบ‡เบชเบธเบ”เปเบฅเบฐ harness เบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ™เบตเป‰เป‚เบ”เบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบเบฐเบ—เบนเป‰.

Terminology

เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ - เบงเบฑเบ”เบ–เบธ OS, เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเป‚เบ”เบ”เบ”เปˆเบฝเบง, เบกเบตเบเบฐเบ—เบนเป‰.
เบเบฐเบ—เบนเป‰ - เบงเบฑเบ”เบ–เบธ OS, เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เบเบฐเบ—เบนเป‰เปเบšเปˆเบ‡เบ›เบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบทเปˆเบ™เป†เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบžเบฒเบเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™.
Multitasking - เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” OS, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบซเบผเบฒเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเป‰เบญเบกเป†เบเบฑเบ™
เบซเบผเบฒเบเบซเบผเบฑเบ - เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบต, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบผเบฒเบเปเบเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™
Multiprocessing - เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบต, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเป†เบเบฑเบ™เบเบฑเบšเป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบซเบผเบฒเบเบ•เบปเบง
Multithreading โ€” เบŠเบฑเบšโ€‹เบชเบดเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹, เบ„เบงเบฒเบกโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เปเบˆเบโ€‹เบขเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบšเบฑเบ™โ€‹เบ”เบฒโ€‹เบซเบผเบฒเบโ€‹เบเบฐโ€‹เบ—เบนเป‰โ€‹.
เบ‚เบฐเปœเบฒเบ™ - เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฒเบเป†เบ„เบฑเป‰เบ‡เบ—เบฒเบ‡เบฎเปˆเบฒเบ‡เบเบฒเบเบžเป‰เบญเบกเป†เบเบฑเบ™เบ•เปเปˆเบซเบปเบงเปœเปˆเบงเบเป€เบงเบฅเบฒ
Asynchrony โ€” เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบฅเปโ€‹เบ–เป‰เบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบ™เบตเป‰โ€‹เบœเบปเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบžเบฒเบโ€‹เบซเบผเบฑเบ‡โ€‹.

เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš

เบšเปเปˆเปเบกเปˆเบ™เบ„เปเบฒเบ™เบดเบเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ”เบตเปเบฅเบฐเบšเบฒเบ‡เบญเบฑเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบžเบตเปˆเบกเบ„เปเบฒเบญเบธเบ›เบฐเบกเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบ•เปˆเบ‡เบเบดเบ™เบญเบฒเบซเบฒเบ™เป€เบŠเบปเป‰เบฒเป€เบ›เบฑเบ™เบ„เปเบฒเบชเบฑเบšเบ—เบตเปˆเปเบ™เบฐเบ™เปเบฒเบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™. เบเบฒเบ™เปเบ•เปˆเบ‡เบเบดเบ™เบญเบฒเบซเบฒเบ™เป€เบŠเบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบ›เบฝเบšเบ—เบฝเบšเบ™เบตเป‰เปเบกเปˆเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™.

เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฐเบเบฝเบกเบญเบฒเบซเบฒเบ™เป€เบŠเบปเป‰เบฒเปƒเบ™เบ•เบญเบ™เป€เบŠเบปเป‰เบฒเบ‚เป‰เบญเบ (CPU) เบ‚เป‰เบญเบเบกเบฒเป€เบฎเบทเบญเบ™เบ„เบปเบง (เบ„เบญเบกเบžเบดเบงเป€เบ•เบต). เบ‚เป‰เบญเบเบกเบต 2 เบกเบท (Cores). เบกเบตเบญเบธเบ›เบฐเบเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบขเบนเปˆเปƒเบ™เป€เบฎเบทเบญเบ™เบ„เบปเบง (IO): เป€เบ•เบปเบฒเบญเบปเบš, เป€เบ•เบปเบฒเบญเบปเบš, เป€เบ•เบปเบฒเบญเบปเบš, เบ•เบนเป‰เป€เบขเบฑเบ™. เบ‚เป‰เบญเบเป€เบ›เบตเบ”เบญเบฒเบเปเบเบฑเบช, เป€เบญเบปเบฒเป€เบ•เบปเบฒเบ‚เบปเป‰เบงเปƒเบชเปˆเบกเบฑเบ™เปเบฅเบฐเบ–เบญเบเบ™เป‰เปเบฒเบกเบฑเบ™เปƒเบชเปˆเบกเบฑเบ™เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบกเบฑเบ™เบฎเป‰เบญเบ™ (asynchronously, Non-blocking-IO-Wait), เป€เบญเบปเบฒเป„เบ‚เปˆเบญเบญเบเบˆเบฒเบเบ•เบนเป‰เป€เบขเบฑเบ™เปเบฅเบฐเปเบ•เบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบœเปˆเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ•เบตเบกเบฑเบ™เบ”เป‰เบงเบเบกเบทเบซเบ™เบถเปˆเบ‡ (เบเบฐเบ—เบนเป‰ #1), เปเบฅเบฐเบ—เบตเบชเบญเบ‡ (เบเบฐเบ—เบนเป‰ #2) เบ–เบทเปเบœเปˆเบ™ (เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเปเบšเปˆเบ‡เบ›เบฑเบ™). เบ”เบฝเบงเบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเป€เบ›เบตเบ”เบเบฐเบ•เบธเบ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเบกเบตเบกเบทเบžเป (เบ„เบงเบฒเบกเบญเบถเบ”เบซเบดเบงเบเบฐเบ—เบนเป‰) เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ™เบตเป‰โ€‹, เปเบŠเปˆ frying เป„เบ”เป‰ heats เป€เบ–เบดเบ‡ (เบเบฒเบ™โ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡โ€‹เบœเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹) เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ‡เบฒเบกโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰ whippedโ€‹. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป€เบญเบทเป‰เบญเบกโ€‹เป€เบ–เบดเบ‡โ€‹เบเบฐโ€‹เบ•เบธเบโ€‹เปเบฅเบฐโ€‹เป€เบ›เบตเบ”โ€‹เบกเบฑเบ™โ€‹เปเบฅเบฐ stupidly เป€เบšเบดเปˆเบ‡โ€‹เบ™โ€‹เป‰โ€‹เปโ€‹เบฒโ€‹เบ•เบปเป‰เบกโ€‹เปƒเบ™โ€‹เบกเบฑเบ™ (เบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡-IO-เบฅเปเบ–เป‰เบฒ), เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบงเบฅเบฒเบ™เบตเป‰เบฅเบฒเบงเบชเบฒเบกเบฒเบ”เบฅเป‰เบฒเบ‡เบˆเบฒเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบฅเบฒเบงเบ•เบต omelet เป„เบ”เป‰.

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ›เบธเบ‡โ€‹เปเบ•เปˆเบ‡ omelette เป‚เบ”เบโ€‹เปƒเบŠเป‰โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆ 2 เบกเบทโ€‹, เปเบฅเบฐโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบซเบผเบฒเบโ€‹, เปเบ•เปˆโ€‹เปƒเบ™โ€‹เบ‚เบฐโ€‹เบ™เบฐโ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹, เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™ whipping omelette เป„เบ”เป‰โ€‹, เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™ 3 เบ„เบฑเป‰เบ‡โ€‹เป„เบ”เป‰โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹: whipping omeletteโ€‹, เบ–เบทโ€‹เบˆเบฒเบ™โ€‹, เปเบŠเปˆโ€‹เบฎเป‰เบญเบ™โ€‹. . CPU เปเบกเปˆเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเป„เบงเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบต, IO เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบเบˆเบฐเบŠเป‰เบฒเบฅเบปเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ„เบทเบเบฒเบ™เบ„เบญเบšเบ„เบญเบ‡ CPU เบเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ IO.

เบชเบทเบšเบ•เปเปˆเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš:

  • เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเบฐเบเบฝเบก omelet, เบ‚เป‰เบญเบเบเปเปˆเบžเบฐเบเบฒเบเบฒเบกเบ›เปˆเบฝเบ™เป€เบ„เบทเปˆเบญเบ‡เบ™เบธเปˆเบ‡, เบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบซเบผเบฒเบเบงเบฝเบ. เป€เบ›เบฑเบ™ nuance เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹: เบ„เบญเบกโ€‹เบžเบดเบงโ€‹เป€เบ•เบตโ€‹เปเบกเปˆเบ™โ€‹เบ”เบตเบโ€‹เบงเปˆเบฒโ€‹เบซเบผเบฒเบโ€‹เปƒเบ™โ€‹เบ™เบตเป‰โ€‹เบโ€‹เปˆโ€‹เบงเบฒโ€‹เบ„เบปเบ™โ€‹.
  • เป€เบฎเบทเบญเบ™เบ„เบปเบงเบ—เบตเปˆเบกเบตเบžเปเปˆเบ„เบปเบงเบซเบผเบฒเบเบ„เบปเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™เบฎเป‰เบฒเบ™เบญเบฒเบซเบฒเบ™ - เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบซเบผเบฒเบเบซเบผเบฑเบ.
  • เบฎเป‰เบฒเบ™เบญเบฒเบซเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบขเบนเปˆเปƒเบ™เบชเบนเบ™เบญเบฒเบซเบฒเบ™เปƒเบ™เบชเบนเบ™เบเบฒเบ™เบ„เป‰เบฒ - data center

.NET เป€เบ„เบทเปˆเบญเบ‡เบกเบท

.NET เปเบกเปˆเบ™เบ”เบตเปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฐเบ—เบนเป‰, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบดเปˆเบ‡เบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. เบ”เป‰เบงเบเปเบ•เปˆเบฅเบฐเบฎเบธเปˆเบ™เปƒเบซเบกเปˆ, เบกเบฑเบ™เปเบ™เบฐเบ™เปเบฒเป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเบซเบกเปˆเป†เบซเบผเบฒเบเบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบงเบเบกเบฑเบ™, เบŠเบฑเป‰เบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡ abstraction เปƒเบ™เป„เบฅเบเบฐเบเบฐเบ—เบนเป‰ OS. เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ‚เบญเบ‡ abstractions, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบญเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ›เปˆเบญเบเปƒเบซเป‰เป‚เบญเบเบฒเบ”, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰ abstraction เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡, เบฅเบปเบ‡เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบซเบผเบฒเบเบฅเบฐเบ”เบฑเบšเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบ, เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เบกเบฑเบ™เป€เบ›เบตเบ”เบ›เบฐเบ•เบนเป€เบžเบทเปˆเบญเบเบดเบ‡เบ•เบปเบงเป€เบญเบ‡เบ”เป‰เบงเบเบ›เบทเบ™เบเบดเบ‡, เปเบ•เปˆเบšเบฒเบ‡เบ„เบฑเป‰เบ‡, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบซเบฒเบเบฒเบ, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบ”เบฝเบงเบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ›เบฐเบˆเบธเบšเบฑเบ™. .

เป‚เบ”เบเป€เบ„เบทเปˆเบญเบ‡เบกเบท, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ—เบฑเบ‡เบชเบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ (APIs) เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบเบญเบšเปเบฅเบฐเปเบžเบเป€เบเบ”เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบก, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบŠเบญเบšเปเบงเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ‡เปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบซเบฒเปƒเบ”เป†เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบซเบผเบฒเบเบเบฐเบ—เบนเป‰.

เบเบณเบฅเบฑเบ‡เป€เบฅเบตเปˆเบกเบซเบปเบงเบ‚เปเป‰

เบซเป‰เบญเบ‡เบฎเบฝเบ™ Thread เป€เบ›เบฑเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบชเบธเบ”เปƒเบ™ .NET เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฐเบ—เบนเป‰. เบœเบนเป‰เบเปเปˆเบชเป‰เบฒเบ‡เบเบญเบกเบฎเบฑเบšเบซเบ™เบถเปˆเบ‡เปƒเบ™เบชเบญเบ‡เบ•เบปเบงเปเบ—เบ™:

  • ThreadStart โ€” เบšเปเปˆโ€‹เบกเบตโ€‹เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹
  • ParameterizedThreadStart - เบกเบตเบซเบ™เบถเปˆเบ‡เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเบ›เบฐเป€เบžเบ”.

เบ•เบปเบงเปเบ—เบ™เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบเบฐเบ—เบนเป‰เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบซเบกเปˆเบซเบผเบฑเบ‡เบˆเบฒเบเป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบ–เป‰เบฒเบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” ParametrizedThreadStart เบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเบœเบนเป‰เบเปเปˆเบชเป‰เบฒเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบงเบฑเบ”เบ–เบธเบ•เป‰เบญเบ‡เบ–เบทเบเบชเบปเปˆเบ‡เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบเบปเบ™เป„เบเบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เปƒเบ”เป†เป„เบ›เบชเบนเปˆเบเบฐเปเบช. เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบเบฒเบ™เบชเป‰เบฒเบ‡ thread เปเบกเปˆเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบฅเบฒเบ„เบฒเปเบžเบ‡, เปเบฅเบฐ thread เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบซเบ™เบฑเบเปเบซเบ™เป‰เบ™, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ 1MB เปƒเบ™ stack เปเบฅเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบš OS API.

new Thread(...).Start(...);

เบซเป‰เบญเบ‡เบฎเบฝเบ™ ThreadPool เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบชเบฐเบ™เบธเบเป€เบเบต. เปƒเบ™ .NET, thread pool เปเบกเปˆเบ™เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบงเบดเบชเบฐเบงเบฐเบเปเบฒ, เปเบฅเบฐเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡ Microsoft เป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบตเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบซเบผเบฒเบเป†เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบปเปˆเบงเป„เบ›:

เบˆเบฒเบเป€เบงเบฅเบฒเบ—เบตเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบกเบฑเบ™เบชเป‰เบฒเบ‡เบซเบผเบฒเบเบซเบปเบงเบ‚เปเป‰เปƒเบ™เบชเบฐเบซเบ‡เบงเบ™เปƒเบ™เบžเบทเป‰เบ™เบซเบฅเบฑเบ‡เปเบฅเบฐเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบญเบปเบฒเบžเบงเบเบกเบฑเบ™เป„เบ›เปƒเบŠเป‰. เบ–เป‰เบฒเบเบฐเบ—เบนเป‰เบ–เบทเบเปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†เปเบฅเบฐเป€เบ›เบฑเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบงเบ‡เบซเบผเบฒเบ, เบชเบฐเบ™เบธเบเป€เบเบตเบ‚เบฐเบซเบเบฒเบเบญเบญเบเป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เป‚เบ—. เป€เบกเบทเปˆเบญเบšเปเปˆเบกเบตเบเบฐเบ—เบนเป‰เบŸเบฃเบตเบขเบนเปˆเปƒเบ™เบชเบฐเบ™เบธเบเป€เบเบตเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เบกเบฑเบ™เบˆเบฐเบฅเปเบ–เป‰เบฒเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฐเบ—เบนเป‰เบเบฑเบšเบ„เบทเบ™เบกเบฒ, เบซเบผเบทเบชเป‰เบฒเบ‡เปƒเบซเบกเปˆ. เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบงเปˆเบฒเบชเบฐเบ™เบธเบเป€เบเบตเบเบฐเบ—เบนเป‰เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบฅเบเบฐเบชเบฑเป‰เบ™เปเบฅเบฐเบšเปเปˆเบ”เบตเบžเปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เบฐเบซเบผเบญเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบเบฐเบ—เบนเป‰เบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบต, เบกเบตเบงเบดเบ—เบตเบเบฒเบ™ QueueUserWorkItem เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” WaitCallback, เป€เบŠเบดเปˆเบ‡เบกเบตเบฅเบฒเบเป€เบŠเบฑเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš ParametrizedThreadStart, เปเบฅเบฐเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบชเบปเปˆเบ‡เบเบฑเบšเบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ”เบฝเบงเบเบฑเบ™.

ThreadPool.QueueUserWorkItem(...);

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ™เบธเบเป€เบเบตเบเบฐเบ—เบนเป‰เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบซเบ™เป‰เบญเบ RegisterWaitForSingleObject เบ–เบทเบเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ IO เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบšเบฅเบฑเบญเบ. เบ•เบปเบงเปเบ—เบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เป€เบกเบทเปˆเบญ WaitHandle เบœเปˆเบฒเบ™เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™ "เบ›เปˆเบญเบเบญเบญเบเบกเบฒ".

ThreadPool.RegisterWaitForSingleObject(...)

.NET เบกเบตเบ•เบปเบงเบˆเบฑเบšเป€เบงเบฅเบฒเบเบฐเบ—เบนเป‰ เปเบฅเบฐเบกเบฑเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบ•เบปเบงเบˆเบฑเบšเป€เบงเบฅเบฒ WinForms/WPF เบ—เบตเปˆเบ•เบปเบงเบˆเบฑเบšเบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เปƒเบชเปˆเบเบฐเบ—เบนเป‰เบ—เบตเปˆเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบต.

System.Threading.Timer

เบเบฑเบ‡เบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเปเบ›เบเบ›เบฐเบซเบผเบฒเบ”เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบœเบนเป‰เปเบ—เบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฑเบšเบเบฐเบ—เบนเป‰เบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบต - เบงเบดเบ—เบตเบเบฒเบ™ BeginInvoke.

DelegateInstance.BeginInvoke

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเบขเบนเปˆเป‚เบ”เบเบซเบเปเป‰เบเปˆเบฝเบงเบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบซเบผเบฒเบเบงเบดเบ—เบตเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒ - CreateThread เบˆเบฒเบ Kernel32.dll Win32 API. เบกเบตเบงเบดเบ—เบตเบเบฒเบ™, เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบเบปเบ™เป„เบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ extern, เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เบตเป‰. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบเบฒเบ™เป‚เบ—เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบžเบฝเบ‡เปเบ•เปˆเบ„เบฑเป‰เบ‡เบ”เบฝเบงเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‚เบตเป‰เบฎเป‰เบฒเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบกเปเบฅเบฐเบ”เบปเบ, เปเบฅเบฐเปเบฎเบ‡เบˆเบนเบ‡เปƒเบˆเบ‚เบญเบ‡เบœเบนเป‰เบ‚เบฝเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เปเบšเบšเบ™เบตเป‰เบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบฅเบถเบเบฅเบฑเบšเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ.

Kernel32.dll CreateThread

เบเบฒเบ™เป€เบšเบดเปˆเบ‡เปเบฅเบฐเบเบฒเบ™เปเบเป‰เบšเบฑเบ™เบซเบฒเบเบฐเบ—เบนเป‰

เบเบฐเบ—เบนเป‰เบ—เบตเปˆเบชเป‰เบฒเบ‡เป‚เบ”เบเบ—เปˆเบฒเบ™, เบญเบปเบ‡เบ›เบฐเบเบญเบšเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐ .NET pool เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก Threads เบ‚เบญเบ‡ Visual Studio. เบ›เปˆเบญเบ‡โ€‹เบขเป‰เบฝเบกโ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เปˆเบฒเบงโ€‹เบชเบฒเบ™โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เปเบกเปˆเบ™โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบš Break . เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบŠเบทเปˆ stack เปเบฅเบฐเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐ thread เป„เบ”เป‰เบชเบฐเบ”เบงเบ, เปเบฅเบฐเบชเบฐเบซเบผเบฑเบš debugging เบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบ‚เบญเบ‡เบŠเบฑเป‰เบ™ Thread, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡ thread, เป€เบŠเบดเปˆเบ‡ OC เปเบฅเบฐ CLR เบˆเบฐเบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒเป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบšเปˆเบ‡เป€เบงเบฅเบฒเบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฐเบ—เบนเป‰.

.NET: เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš multithreading เปเบฅเบฐ asynchrony. เบžเบฒเบเบ—เบต 1

Task Parallel Library

Task Parallel Library (TPL) เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™ .NET 4.0. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš asynchrony. เบฅเบฐเบซเบฑเบ”เปƒเบ”เป†เบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เป€เบเบปเปˆเบฒเปเบเปˆเปเบกเปˆเบ™เบ–เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบกเปเบฅเบฐเบ”เบปเบ. เบซเบปเบงเปœเปˆเบงเบเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ TPL เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ Task เบˆเบฒเบ System.Threading.Tasks namespace. เบงเบฝเบเบ‡เบฒเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบซเบเปเป‰เบ—เปเป‰เปƒเบ™เป„เบฅเบเบฐเบเบฐเบ—เบนเป‰. เบ”เป‰เบงเบเบžเบฒเบชเบฒ C# เบชเบฐเบšเบฑเบšเปƒเปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบซเบ‡เปˆเบฒเบ‡เบฒเบกเปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Tasks - async/await operators . เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ” asynchronous เบ„เบทเบเบฑเบšเบงเปˆเบฒเบกเบฑเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐ synchronous, เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ„เบปเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบซเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบžเบฒเบเปƒเบ™เบ‚เบญเบ‡เบเบฐเบ—เบนเป‰เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบšเปเปˆเปเบŠเปˆเปเบ‚เปเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบฒเบง. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ async / await เปเบกเปˆเบ™เบซเบปเบงเบ‚เปเป‰เบซเบ™เบถเปˆเบ‡เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเบผเบฒเบเบšเบปเบ”เบ„เบงเบฒเบก, เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบญเบปเบฒเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบชเบญเบ‡เบชเบฒเบกเบ›เบฐเป‚เบซเบเบ:

  • async เปเบกเปˆเบ™เบ•เบปเบงเปเบเป‰เป„เบ‚เบงเบดเบ—เบตเบเบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™ Task เบซเบผเบท void
  • เปเบฅเบฐเบฅเปเบ–เป‰เบฒเปเบกเปˆเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเปเบ–เป‰เบฒ Task เบ—เบตเปˆเบšเปเปˆเบ›เบดเบ”เบเบฑเป‰เบ™.

เบญเบตเบเป€เบ—เบทเปˆเบญ เปœเบถเปˆเบ‡: เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเปเบ–เป‰เบฒ, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบปเปˆเบงเป„เบ› (เบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™), เบˆเบฐเบ›เปˆเบญเบเบเบฐเบ—เบนเป‰เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบทเปˆเบกเบญเบตเบ, เปเบฅเบฐเป€เบกเบทเปˆเบญ Task เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบฅเบฐเบเบฐเบ—เบนเป‰ (เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบ•เป‰เบญเบ‡เบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบงเบปเป‰เบฒเบชเบฐเบžเบฒเบšเบเบฒเบ™. , เปเบ•เปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบงเปˆเบฒเบ•เปเปˆเบกเบฒ) เบˆเบฐเบชเบทเบšเบ•เปเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบดเบ—เบตเบเบฒเบ™เบ•เบทเปˆเบกเบญเบตเบ. เบžเบฒเบเปƒเบ™ .NET, เบเบปเบ™เป„เบเบ™เบตเป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบœเบปเบ™เบ•เบญเบšเปเบ—เบ™เบ‚เบญเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ”, เป€เบกเบทเปˆเบญเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบŠเบฑเป‰เบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ‚เบญเบ‡เบฅเบฑเบ”เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เปƒเบ™เบ•เปˆเบญเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบถเป‰เบ™เบขเบนเปˆเบเบฑเบšเบฅเบฑเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เปƒเบœเบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบชเบปเบ™เปƒเบˆเบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‡เปˆเบฒเบเป†เป‚เบ”เบเปƒเบŠเป‰ asynั / เบฅเปเบ–เป‰เบฒ, เบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ›เบฐเบเบญเบšเป‚เบ”เบเปƒเบŠเป‰ JetBrains dotPeek เบเบฑเบš Compiler Generated Code เป€เบ›เบตเบ”เปƒเบŠเป‰.

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Task. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ” (เบเบฐเบ—เบนเป‰.เบ™เบญเบ™ (10000)), เปเบ•เปˆเปƒเบ™เบŠเบตเบงเบดเบ”เบˆเบดเบ‡เบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™ CPU เบซเบผเบฒเบ.

using TCO = System.Threading.Tasks.TaskCreationOptions;

public static async void VoidAsyncMethod() {
    var cancellationSource = new CancellationTokenSource();

    await Task.Factory.StartNew(
        // Code of action will be executed on other context
        () => Thread.Sleep(10000),
        cancellationSource.Token,
        TCO.LongRunning | TCO.AttachedToParent | TCO.PreferFairness,
        scheduler
    );

    //  Code after await will be executed on captured context
}

A Task เบ–เบทเบโ€‹เบชเป‰เบฒเบ‡โ€‹เบ‚เบถเป‰เบ™โ€‹เป‚เบ”เบโ€‹เบกเบตโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹:

  • LongRunning เปเบกเปˆเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบงเปˆเบฒเบงเบฝเบเบ‡เบฒเบ™เบˆเบฐเบšเปเปˆเบชเปเบฒเป€เบฅเบฑเบ”เบขเปˆเบฒเบ‡เป„เบงเบงเบฒ, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบญเบปเบฒเบเบฐเบ—เบนเป‰เบญเบญเบเบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบต, เปเบ•เปˆเบชเป‰เบฒเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เป€เบžเบทเปˆเบญเบšเปเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ•เปเปˆเบ„เบปเบ™เบญเบทเปˆเบ™.
  • AttachedToParent - เบงเบฝเบเบ‡เบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบฅเบฝเบ‡เบ•เบฒเบกเบฅเบณเบ”เบฑเบš. เบ–เป‰เบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ Task เบญเบฒเบ”เบˆเบฐเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเบกเบฑเบ™เป€เบญเบ‡เป„เบ”เป‰เบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเบฐเบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบฅเบนเบเบ‚เบญเบ‡เบกเบฑเบ™.
  • PreferFairness - เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบงเบฝเบเบ—เบตเปˆเบชเบปเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบฑเป‰เบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ•เปเปˆเบกเบฒ. เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบ›เบฐเบเบฑเบ™.

เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเบชเบญเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™ CancellationToken. เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบ”เบณเป€เบ™เบตเบ™เบเบฒเบ™เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเป‰เบง, เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบ•เบฑเบกเป„เบ›เบ”เป‰เบงเบเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบชเบฐเบ–เบฒเบ™เบฐ CancellationToken. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบเบงเบ”เบชเบญเบš, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบงเบดเบ—เบตเบเบฒเบ™เบเบปเบเป€เบฅเบตเบเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบขเบนเปˆเปƒเบ™เบงเบฑเบ”เบ–เบธ CancellationTokenSource เบˆเบฐเบชเบฒเบกเบฒเบ”เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‚เบญเบ‡ Task เบžเบฝเบ‡เปเบ•เปˆเบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบงเบฑเบ”เบ–เบธเบเปเบฒเบ™เบปเบ”เป€เบงเบฅเบฒเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ TaskScheduler. เบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ™เบตเป‰เปเบฅเบฐเบฅเบนเบเบซเบฅเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบกเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เปเบˆเบเบขเบฒเบ Tasks เปƒเบ™เบ—เบปเปˆเบงเบซเบปเบงเบ‚เปเป‰เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, Task เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เบซเบปเบงเบ‚เปเป‰เปเบšเบšเบชเบธเปˆเบกเบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบต.

เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบฅเปเบ–เป‰เบฒเปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš Task เบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‚เบฝเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™, เบ–เป‰เบฒเบกเบตเบซเบ™เบถเปˆเบ‡, เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ”เบฝเบงเบเบฑเบ™ (เบกเบฑเบเบˆเบฐเบซเบกเบฒเบเป€เบ–เบดเบ‡เบซเบปเบงเบ‚เปเป‰เบ”เบฝเบงเบเบฑเบ™) เป€เบ›เบฑเบ™เบฅเบฐเบซเบฑเบ”เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบฅเปเบ–เป‰เบฒ.

เบงเบดเบ—เบตเบเบฒเบ™เบ–เบทเบเบซเบกเบฒเบเป€เบ›เบฑเบ™ async void, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเปเบ–เป‰เบฒ, เปเบ•เปˆเบฅเบฐเบซเบฑเบ”เบเบฒเบ™เป‚เบ—เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰. เบ–เป‰เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™เบ•เป‰เบญเบ‡เบเบฑเบšเบ„เบทเบ™ Task. เบงเบดเบ—เบตเบเบฒเบ™เบซเบกเบฒเบ async void เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบปเปˆเบงเป„เบ›: เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เป€เบซเบ”เบเบฒเบ™เบซเบผเบทเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเปˆเบฝเบงเบเบฑเบšเป„เบŸเปเบฅเบฐเบฅเบทเบกเบซเบผเบฑเบเบเบฒเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเปƒเบซเป‰เป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบชเบดเป‰เบ™เบชเบธเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบ•เปˆเบเบฑเบ‡เบชเบปเปˆเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ Task.

เปƒเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบงเบดเบ—เบตเบเบฒเบ™ StartNew เบเบฑเบšเบ„เบทเบ™เบกเบฒ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ ConfigureAwait เบ”เป‰เบงเบเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบˆเบฐเบชเบทเบšเบ•เปเปˆเบšเปเปˆเป„เบ”เป‰เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบˆเบฑเบš, เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เป€เบญเบ‡. เบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเป€เบฎเบฑเบ”เป„เบ”เป‰เบ•เบฐเบซเบผเบญเบ”เป€เบงเบฅเบฒเป€เบกเบทเปˆเบญเบšเปเบฅเบดเบšเบปเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบฅเปเบ–เป‰เบฒ. เบ™เบตเป‰เบเบฑเบ‡เป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบˆเบฒเบ MS เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบˆเบฑเบ”เบชเบปเปˆเบ‡เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”.

เปƒเบซเป‰เป€เบฎเบปเบฒเบขเบนเปˆเบ•เบทเปˆเบกเบญเบตเบเปœเป‰เบญเบเปœเบถเปˆเบ‡เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบฅเปเบ–เป‰เบฒเปƒเบซเป‰เบชเบณเป€เบฅเบฑเบ”เปœเป‰เบฒเบงเบฝเบเป„เบ”เป‰. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เป‚เบ”เบเบกเบตเบ„เปเบฒเบ„เบดเบ”เบ„เปเบฒเป€เบซเบฑเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบงเบฅเบฒเบ—เบตเปˆเบ„เบงเบฒเบกเบ„เบฒเบ”เบซเบงเบฑเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เบตเบ•เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปเบฅเบฐเป€เบกเบทเปˆเบญเบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบ”เบต.

public static async void AnotherMethod() {

    int result = await AsyncMethod(); // good

    result = AsyncMethod().Result; // bad

    AsyncMethod().Wait(); // bad

    IEnumerable<Task> tasks = new Task[] {
        AsyncMethod(), OtherAsyncMethod()
    };

    await Task.WhenAll(tasks); // good
    await Task.WhenAny(tasks); // good

    Task.WaitAll(tasks.ToArray()); // bad
}

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบฅเปเบ–เป‰เบฒ Task เบชเปเบฒเป€เบฅเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบฐเบเบฑเบ”เบเบฐเบ—เบนเป‰เบเบฒเบ™เป‚เบ—;

เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ™เบเบฐเบ—เบนเป‰เบเบฒเบ™เป‚เบ—เบˆเบปเบ™เบเปˆเบงเบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆ. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบ”เบตเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ„เบญเบšเบ„เบญเบ‡เบเบฐเบ—เบนเป‰, เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบฑเบ™เบกเบตเบ„เปˆเบฒเบ‚เบญเบ‡เป‚เบ›เบฅเปเบเบฅเบก, เบกเบตเบ„เบงเบฒเบกเบ‡เบฝเบšเป†เบ‡เปˆเบฒเบเบ”เบฒเบ, เปเบ•เปˆเบเบฑเบ‡เบเป‰เบญเบ™เบงเปˆเบฒเบ–เป‰เบฒเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบกเบตเบฅเปเบ–เป‰เบฒเบขเบนเปˆ, เปเบฅเบฐเบชเบฐเบžเบฒเบšเบเบฒเบ™ synchronization เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบซเบปเบงเบ‚เปเป‰เป‚เบ—เบซเบฒเบžเบฒเบเบซเบผเบฑเบ‡. เบฅเปเบ–เป‰เบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ deadlock : เบเบฐเบ—เบนเป‰เบเบฒเบ™เป‚เบ—เบฅเปเบ–เป‰เบฒเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ asynchronous เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆ, เบงเบดเบ—เบตเบเบฒเบ™ asynchronous เบžเบฐเบเบฒเบเบฒเบกเปƒเบ™ vain เบชเบทเบšเบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบ™เปƒเบ™เบเบฐเบ—เบนเป‰เบเบฒเบ™เป‚เบ—.

เบ‚เปเป‰เป€เบชเบเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบฑเบ” asynchronous เป€เบกเบทเปˆเบญเปƒเบŠเป‰ async/await เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™ - เบžเบงเบเบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบทเบเบฑเบ™เบเบฑเบšเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ–เบทเบ synchronous. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบฅเปเบ–เป‰เบฒ synchronous exorcism เบเบฑเบš Task, เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ AggregateException, i.e. เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ›เบฐเป€เบžเบ” InnerException เปเบฅเบฐเบ‚เบฝเบ™เบชเบฒเบเบ•เปˆเบญเบ‡เป‚เบชเป‰เบ–เป‰เบฒเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เบขเบนเปˆเปƒเบ™เบ•เบฑเบ™เบˆเบฑเบšเบซเบ™เบถเปˆเบ‡เบซเบผเบทเปƒเบŠเป‰เบเบฒเบ™เบˆเบฑเบšเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ•เปˆเบญเบ‡เป‚เบชเป‰เบ‚เบญเบ‡เบ•เบฑเบ™เบˆเบฑเบšเบ—เบตเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบเปƒเบ™เป‚เบฅเบ C #.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเบชเบฒเบกเปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบเบฑเบ‡เบ–เบทเบเบซเบกเบฒเบเบงเปˆเบฒเบšเปเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ”เบฝเบงเบเบฑเบ™เปเบฅเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบšเบฑเบ™เบซเบฒเบ”เบฝเบงเบเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบงเบดเบ—เบตเบเบฒเบ™ WhenAny เปเบฅเบฐ WhenAll เปเบกเปˆเบ™เบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบเบธเปˆเบก Tasks;

เบเบฒเบ™เบขเบธเบ”เป€เบŠเบปเบฒเบเบฐเบ—เบนเป‰

เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ•เปˆเบฒเบ‡เป†, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เป„เบซเบผเบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบกเบฑเบ™เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบตเป‰. เบซเป‰เบญเบ‡เบฎเบฝเบ™เบเบฐเบ—เบนเป‰เบกเบตเบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก: เป€เบญเบปเบฒเบฅเบนเบเบญเบญเบ ะธ เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡. เบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบšเปเปˆเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒ เบซเบผเบฑเบ‡เบˆเบฒเบเป‚เบ—เบซเบฒเบกเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบชเบธเปˆเบกเปƒเบ”เบเปเปˆเบ•เบฒเบก, เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบ”เป†, เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบˆเบฐเบ–เบทเบเบ–เบดเป‰เบก เบเบฐเบ—เบนเป‰AbortedException. เบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบˆเบฐเบ–เบทเบเบ–เบดเป‰เบกเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบžเบตเปˆเบกเบ•เบปเบงเปเบ› integer, เปเบกเปˆเบ™เบšเป? เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบซเบผเบฒเบ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ CLR เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเปเปˆเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ—. Thread.BeginCriticalRegion, Thread.EndCriticalRegion. เบฅเบฐเบซเบฑเบ”เปƒเบ”เป†เบ—เบตเปˆเบ‚เบฝเบ™เบขเบนเปˆเปƒเบ™เบšเบฅเบฑเบญเบเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบซเปเปˆเบขเบนเปˆเปƒเบ™เบเบฒเบ™เป‚เบ—เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰, เปƒเบ™เบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบเบญเบš, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ•เบฑเบ™เบ”เป‰เบงเบเบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เปเบ•เปˆเบชเบธเบ”เบ—เป‰เบฒเบเบšเปเปˆเปเบกเปˆเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. Microsoft เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบซเบผเบฒเบเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป„เบ”เป‰เบฅเบงเบกเป€เบญเบปเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ .net core.

เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰เบซเบผเบฒเบเบ‚เบถเป‰เบ™. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฐเบ—เบนเป‰เป‚เบ”เบเบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™ ThreadInterruptedException เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฐเบ—เบนเป‰เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบฅเปเบ–เป‰เบฒ. เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบชเบฐเบ–เบฒเบ™เบฐเบ™เบตเป‰เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบซเป‰เบญเบเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบฅเปเบ–เป‰เบฒ WaitHandle, lock, เบซเบผเบทเบซเบผเบฑเบ‡เบˆเบฒเบเป‚เบ—เบซเบฒ Thread.Sleep.

เบ—เบฑเบ‡เบชเบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เบšเปเปˆเบ”เบตเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ„เบฒเบ”เป€เบ”เบปเบฒเบšเปเปˆเป„เบ”เป‰. เบเบฒเบ™เปเบเป‰เป„เบ‚เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ CancellationToken เปเบฅเบฐเบซเป‰เบญเบ‡เบฎเบฝเบ™ เปเบซเบผเปˆเบ‡ CancellationToken. เบˆเบธเบ”เบ™เบตเป‰เปเบกเปˆเบ™: เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบŠเบฑเป‰เบ™ CancellationTokenSource เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปเบฅเบฐเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบœเบนเป‰เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเบเบฒเบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™. เบเบปเบเป€เบฅเบตเบเบเบฒเบ™. เบžเบฝเบ‡เปเบ•เปˆ CancellationToken เบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡ CancellationToken เบšเปเปˆเบชเบฒเบกเบฒเบ”เบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เป„เบ”เป‰เบ–เบทเบเบเบปเบเป€เบฅเบตเบ. เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” Boolean เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰ เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบเบปเบเป€เบฅเบตเบเปเบฅเป‰เบง เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™ เบฎเป‰เบญเบ‡เบ‚เปเบเบปเบเป€เบฅเบตเบเปเบฅเป‰เบง. เบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบ–เบดเป‰เบกเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™ TaskCelledException เบ–เป‰เบฒเบงเบดเบ—เบตเบเบฒเบ™เบเบปเบเป€เบฅเบตเบเบ–เบทเบเป€เบญเบตเป‰เบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡ CancellationToken เบ—เบตเปˆเบ–เบทเบ parroted. เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰. เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบ•เบฑเบกโ€‹เบ—เบตเปˆโ€‹เปƒเบ™โ€‹เบˆเบธเบ”โ€‹เปƒเบ”โ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบเบปเบโ€‹เป€เบฅเบตเบโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเบปเบโ€‹เป€เบฅเบตเบ.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป‚เบซเบ”เบฎเป‰เบฒเบเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบขเบธเบ”เบเบฐเบ—เบนเป‰เปเบกเปˆเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ Win32 API TerminateThread. เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡ CLR เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰. เปƒเบ™ MSDN เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เบตเป‰: "TerminateThread เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบ—เบตเปˆเบชเบธเบ”เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. โ€œ

เบเบฒเบ™เบ›เปˆเบฝเบ™ API เป€เบ”เบตเบกเป€เบ›เบฑเบ™ Task Based เป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบต FromAsync

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป‚เบŠเบเบ”เบตเบžเปเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบ Tasks เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปเบฅเบฐเบขเบธเบ”เป€เบŠเบปเบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบ„เบงเบฒเบกเบขเป‰เบฒเบ™เบ—เบตเปˆเบ‡เบฝเบšเบชเบฐเบซเบ‡เบปเบšเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบ•เป‰เบญเบ‡เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบš APIs เป€เบเบปเปˆเบฒเบซเบผเบฒเบ, เบ—เบฑเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเปเบฅเบฐเบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ—เปโ€‹เบฅเบฐโ€‹เบกเบฒเบ™โ€‹เปƒเบ™โ€‹เบญเบฐโ€‹เบ”เบตเบ”โ€‹. เป‚เบŠเบเบ”เบต, เบ—เบตเบกเบ‡เบฒเบ™ .NET Framework เป„เบ”เป‰เบ”เบนเปเบฅเบžเบงเบเป€เบฎเบปเบฒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบ—เบตเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ”เบนเปเบฅเบ•เบปเบงเป€เบญเบ‡. เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐ, .NET เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเป€เบˆเบฑเบšเบ›เบงเบ”เบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก asynchronous เป€เบเบปเปˆเบฒเป„เบ›เบซเบฒเปƒเบซเบกเปˆ. เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™ FromAsync เบ‚เบญเบ‡ TaskFactory. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเปเปˆเบงเบดเบ—เบตเบเบฒเบ™ async เป€เบเบปเปˆเบฒเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ WebRequest เปƒเบ™ Task เป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰.

object state = null;
WebRequest wr = WebRequest.CreateHttp("http://github.com");
await Task.Factory.FromAsync(
    wr.BeginGetResponse,
    we.EndGetResponse
);

เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เบปเบงเบขเปˆเบฒเบ‡เปเบฅเบฐเบ—เปˆเบฒเบ™เบšเปเปˆเบซเบ™เป‰เบฒเบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบšเบšเบ™เบตเป‰เบเบฑเบšเบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เปเบ•เปˆเป‚เบ„เบ‡เบเบฒเบ™เป€เบเบปเปˆเบฒเปƒเบ”เบเปเปˆเบ•เบฒเบกเปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ teeming เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ BeginDoSomething เบ—เบตเปˆเบเบฑเบšเบ„เบทเบ™ IAsyncResult เปเบฅเบฐ EndDoSomething เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบกเบฑเบ™.

เบ›เปˆเบฝเบ™ API เป€เบ”เบตเบกเป€เบ›เบฑเบ™ Task Based เป‚เบ”เบเปƒเบŠเป‰เบ„เบฅเบฒเบช TaskCompletionSource

เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบกเปˆเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ TaskCompletionSource. เปƒเบ™เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆ, เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบฅเบฐเบ™เบถเบเป€เบ–เบดเบ‡เบงเบดเบ—เบตเบเบฒเบ™ RegisterWaitForSingleObject เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ ThreadPool, เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเปเปˆ APIs asynchronous เป€เบเบปเปˆเบฒเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบชเบฐเบ”เบงเบเปƒเบ™ Tasks.

เบ—เปˆเบฒเบ™เบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ FromAsync เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ TaskFactory เบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบˆเบทเปˆเบ›เบฐเบซเบงเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบšเบš asynchronous เปƒเบ™ .net เบ—เบตเปˆ Microsoft เป„เบ”เป‰เบชเบฐเป€เบซเบ™เบตเปƒเบ™เป„เบฅเบเบฐ 15 เบ›เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ: เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐ Task-Based Asynchronous Pattern (TAP), เบกเบต Asynchronous Programming Pattern (APP), เป€เบŠเบดเปˆเบ‡. เปเบกเปˆเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเบฑเบšเบ„เบทเบ™เบกเบฒ IAsyncResult เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™ เบชเบธเบ”เบ—เป‰เบฒเบDoSomething เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเบกเบฑเบ™เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบกเปเบฅเบฐเบ”เบปเบเบ‚เบญเบ‡เบ›เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบงเบดเบ—เบตเบเบฒเบ™ FromAsync เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš, เปเบ•เปˆเป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›, เบกเบฑเบ™เบ–เบทเบเบ›เปˆเบฝเบ™เปเบ—เบ™เบ”เป‰เบงเบเบฎเบนเบšเปเบšเบš Asynchronous เป€เบซเบ”เบเบฒเบ™ (เปเบฅเบฐ AP), เป€เบŠเบดเปˆเบ‡เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบซเบ”เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบˆเบฐเบ–เบทเบเบเบปเบเบ‚เบถเป‰เบ™เบกเบฒเป€เบกเบทเปˆเบญเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปเบšเบš asynchronous เบชเปเบฒเป€เบฅเบฑเบ”.

TaskCompletionSource เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบซเปเปˆ Tasks เปเบฅเบฐ APIs เป€เบเบปเปˆเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ›เบฐเบกเบฒเบ™เบฎเบนเบšเปเบšเบšเป€เบซเบ”เบเบฒเบ™. เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ™เบตเป‰: เบงเบฑเบ”เบ–เบธเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เบกเบตเบŠเบฑเบšเบชเบดเบ™เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” Task, เบชเบฐเบ–เบฒเบ™เบฐเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™ SetResult, SetException, เปเบฅเบฐเบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ TaskCompletionSource. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเปเบ–เป‰เบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบทเบฅเบปเป‰เบกเป€เบซเบฅเบงเป‚เบ”เบเบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เป‚เบ”เบเบญเบตเบ‡เบ•เบฒเบกเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบš TaskCompletionSource. เบ–เป‰เบฒเบกเบฑเบ™เบเบฑเบ‡เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰, เป€เบŠเบดเปˆเบ‡เบšเบฒเบ‡ EAP API เป€เบเบปเปˆเบฒเบ–เบทเบเบซเปเปˆเบขเบนเปˆเปƒเบ™ Task เป‚เบ”เบเปƒเบŠเป‰ TaskCompletionSource: เป€เบกเบทเปˆเบญเป€เบซเบ”เบเบฒเบ™เป„เบŸเป„เบซเบกเป‰, Task เบˆเบฐเบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเบชเปเบฒเป€เบฅเบฑเบ”, เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฅเปเบ–เป‰เบฒ. เบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเป„เบ”เป‰เบฎเบฑเบšเบงเบฑเบ”เบ–เบธ เบœเบปเบ™.

public static Task<Result> DoAsync(this SomeApiInstance someApiObj) {

    var completionSource = new TaskCompletionSource<Result>();
    someApiObj.Done += 
        result => completionSource.SetResult(result);
    someApiObj.Do();

    result completionSource.Task;
}

TaskCompletionSource Tips & Tricks

เบเบฒเบ™เบซเปเปˆ APIs เป€เบเบปเปˆเบฒเบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ TaskCompletionSource. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เป€เบ›เบตเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปƒเบ™เบเบฒเบ™เบญเบญเบเปเบšเบš APIs เบ•เปˆเบฒเบ‡เป†เปƒเบ™ Tasks เบ—เบตเปˆเบšเปเปˆเบ„เบญเบšเบ„เบญเบ‡เบเบฐเบ—เบนเป‰. เปเบฅเบฐเบชเบฒเบเบ™เป‰เปเบฒ, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบทเปˆ, เป€เบ›เบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบตเบฅเบฒเบ„เบฒเปเบžเบ‡เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเบˆเปเบฒเบเบฑเบ” (เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบกเบฒเบˆเบฒเบเบˆเปเบฒเบ™เบงเบ™ RAM). เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเป‚เบ”เบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ—เบตเปˆเป‚เบซเบฅเบ”เบ—เบตเปˆเบกเบตเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เบ—เบธเบฅเบฐเบเบดเบ”เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™. เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบ‚เป‰เบญเบเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” trick เป€เบŠเบฑเปˆเบ™ Long-Polling.

เปƒเบ™เบชเบฑเป‰เบ™, เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡ trick เปเบกเปˆเบ™เบ™เบตเป‰: เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ API เบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบ‚เบญเบ‡เบกเบฑเบ™, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ API, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบšเปเปˆเบชเบฒเบกเบฒเบ”เบฅเบฒเบเบ‡เบฒเบ™เป€เบซเบ”เบเบฒเบ™, เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฐเบ–เบฒเบ™เบฐเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™ APIs เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡ HTTP เบเปˆเบญเบ™เป€เบงเบฅเบฒเบ‚เบญเบ‡ WebSocket เบซเบผเบทเป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ™เบตเป‰. เบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบ–เบฒเบกเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP. เป€เบŠเบตเบšเป€เบงเบต HTTP เบšเปเปˆเบชเบฒเบกเบฒเบ”เบฅเบดเป€เบฅเบตเปˆเบกเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒเป„เบ”เป‰. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‡เปˆเบฒเบเป†เบ„เบทเบเบฒเบ™เบชเบณเบซเบผเบงเบ”เป€เบŠเบตเบšเป€เบงเบตเป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒ, เปเบ•เปˆเบญเบฑเบ™เบ™เบตเป‰เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบ™เป€เบŠเบตเบšเป€เบงเบต เปเบฅเบฐเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป‚เบ”เบเบชเบฐเป€เบฅเปˆเบ TimerInterval / 2. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบ›เบฐเบกเบฒเบ™เบ™เบตเป‰, trick เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ Long Polling เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เบ„เบปเป‰เบ™, เป€เบŠเบดเปˆเบ‡เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบˆเบฒเบ. เป€เบŠเบตเบšเป€เบงเบตเบˆเบปเบ™เบเปˆเบงเบฒเปเบปเบ”เป€เบงเบฅเบฒเปเบปเบ”เบญเบฒเบเบธ เบซเบผเบทเป€เบซเบ”เบเบฒเบ™เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ–เป‰เบฒเป€เบซเบ”เบเบฒเบ™เป„เบ”เป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡, เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡.

while(!eventOccures && !timeoutExceeded)  {

  CheckTimout();
  CheckEvent();
  Thread.Sleep(1);
}

เปเบ•เปˆเบเบฒเบ™เปเบเป‰เป„เบ‚เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบˆเบฐเบžเบดเบชเบนเบ”เบงเปˆเบฒเป€เบ›เบฑเบ™เบ‚เบตเป‰เบฎเป‰เบฒเบเบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบˆเปเบฒเบ™เบงเบ™เบฅเบนเบเบ„เป‰เบฒเบฅเปเบ–เป‰เบฒเป€เบซเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เปเบ•เปˆเบฅเบฐเบฅเบนเบเบ„เป‰เบฒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ„เบญเบšเบ„เบญเบ‡เบเบฐเบ—เบนเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบฅเปเบ–เป‰เบฒเป€เบซเบ”เบเบฒเบ™. เปเบกเปˆเบ™เปเบฅเป‰เบง, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒ 1ms เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป€เบกเบทเปˆเบญเป€เบซเบ”เบเบฒเบ™เบ–เบทเบเบเบฐเบ•เบธเป‰เบ™, เบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบเบˆเบฐเบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เปเบ•เปˆเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบŠเบญเบšเปเบงเบฎเป‰เบฒเบเปเบฎเบ‡เบเบงเปˆเบฒเบ—เบตเปˆเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰? เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒ Thread.Sleep(1), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป‚เบซเบฅเบ”เบซเบผเบฑเบเบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบซเบ™เบถเปˆเบ‡ 100% เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบ, rotating เปƒเบ™เบงเบปเบ‡เบˆเบญเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ TaskCompletionSource เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” remake เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰:

class LongPollingApi {

    private Dictionary<int, TaskCompletionSource<Msg>> tasks;

    public async Task<Msg> AcceptMessageAsync(int userId, int duration) {

        var cs = new TaskCompletionSource<Msg>();
        tasks[userId] = cs;
        await Task.WhenAny(Task.Delay(duration), cs.Task);
        return cs.Task.IsCompleted ? cs.Task.Result : null;
    }

    public void SendMessage(int userId, Msg m) {

        if (tasks.TryGetValue(userId, out var completionSource))
            completionSource.SetResult(m);
    }
}

เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบžเป‰เบญเบก, เปเบ•เปˆเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบกเบฑเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบ—เปˆเบฒเบ™เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ, เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเบกเบฒเบฎเบญเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเปƒเบœเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒ: เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบงเบดเบ—เบตเบเบฒเบ™ AsseptMessageAsync เบ„เบงเบ™เบเบฑเบšเบ„เบทเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเป‰เบง. เบ–เป‰เบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบตเบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบธเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปƒเบŠเป‰ ValueTask.

เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เปเบฅเบฐเบงเบฒเบ‡ TaskCompletionSource เปƒเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบก, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบฅเปเบ–เป‰เบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเปˆเบญเบ™: เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบซเบกเบปเบ”เบญเบฒเบเบธเบซเบผเบทเบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ”เป‰เบฎเบฑเบš.

ValueTask: เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เปเบฅเบฐเปเบ™เบงเปƒเบ”

เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ async / เบฅเปเบ–เป‰เบฒ, เบ„เบทเบเบฑเบšเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”, เบชเป‰เบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ‚เบญเบ‡เบฅเบฑเบ”เบˆเบฒเบเบงเบดเบ—เบตเบเบฒเบ™, เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเปƒเบซเบกเปˆ, เป€เบŠเบดเปˆเบ‡เป€เบเบทเบญเบšเบชเบฐเป€เบซเบกเบตเบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบซเบฒเบเบฒเบเบกเบฑเบ™เบเปเปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒเป„เบ”เป‰. เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเป€เบฅเบทเป‰เบญเบเป†, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบงเบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบผเบฒเบเบชเบดเบšเปเบฅเบฐเบซเบผเบฒเบเบฎเป‰เบญเบเบžเบฑเบ™เบเบฒเบ™เป‚เบ—เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต. เบ–เป‰เบฒเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”, เบกเบฑเบ™เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ‚เป‰เบฒเบกเบงเบดเบ—เบตเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ .NET เบชเบฐเบซเบ™เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ™เบตเป‰ - เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ ValueTask . เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบŠเบฑเบ”เป€เบˆเบ™, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เบญเบ‡เบกเบฑเบ™: เบกเบต cache เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเป€เบฅเบทเป‰เบญเบเป†. เบกเบตเบกเบนเบ™เบ„เปˆเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบ™เบฑเป‰เบ™เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ; เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เปเบšเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบšเปเปˆเบŠเบดเป‰เบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเปเบˆเป‰เบ‡เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

public async Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return val;
    return await RequestById(id);
}

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบฅเบฑเบเบ™เป‰เบญเบ, เปเบฅเบฐเบ„เบงเบฒเบกเบขเป‰เบฒเบ™เบเบปเบงเป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆ Roslyn เบˆเบฐเบชเป‰เบฒเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบ„เบทเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

public Task<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return Task.FromResult(val);
    return RequestById(id);
}

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฎเป‰เบญเบ™, เบ„เบท, เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบกเบนเบ™เบ„เปˆเบฒเบˆเบฒเบเบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบกเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบเบฒเบ™เป‚เบซเบผเบ”เบขเบนเปˆเปƒเบ™ GC, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบซเบฒเบเบฒเบเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เป„เบ›เบซเบฒ IO เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™. , เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เป€เบ›เบฑเบ™เบšเบงเบ / เบฅเบปเบšเปเบšเบšเป€เบเบปเปˆเบฒ:

public ValueTask<string> GetById(int id) {

    if (cache.TryGetValue(id, out string val))
        return new ValueTask<string>(val);
    return new ValueTask<string>(RequestById(id));
}

เบ‚เปเปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰: เบ–เป‰เบฒเบกเบตเบกเบนเบ™เบ„เปˆเบฒเปƒเบ™ cache, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบˆเบฐเบ–เบทเบเบซเปเปˆเบ”เป‰เบงเบเบ„เบงเบฒเบกเบซเบกเบฒเบ. เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เป‚เบ—เบšเปเปˆเบชเบปเบ™เปƒเบˆเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เปƒเบ”เบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™: ValueTask, เบˆเบฒเบเบˆเบธเบ”เบ‚เบญเบ‡ syntax C#, เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบทเบเบฑเบ™เบเบฑเบš Task เบ›เบปเบเบเบฐเบ•เบดเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰.

TaskSchedulers: เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบงเบฝเบเบ‡เบฒเบ™

API เบ•เปเปˆเป„เบ›เบ—เบตเปˆเบ‚เป‰เบญเบเบขเบฒเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบกเปˆเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ TaskScheduler เปเบฅเบฐเบญเบฐเบ™เบธเบžเบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเปเบฅเป‰เบงเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบงเปˆเบฒ TPL เบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบเบฒเบ™เปเบˆเบเบขเบฒเบเบงเบฝเบเบ‡เบฒเบ™เปƒเบ™เบ—เบปเปˆเบงเบเบฐเบ—เบนเป‰. เบเบธเบ”เบ—เบฐเบชเบฒเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ–เบทเบเบเปเบฒเบ™เบปเบ”เบขเบนเปˆเปƒเบ™เบฅเบนเบเบซเบฅเบฒเบ™เบ‚เบญเบ‡เบŠเบฑเป‰เบ™ TaskScheduler. เป€เบเบทเบญเบšเบ—เบธเบเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”. ParallelExtensionsExtras, เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบ Microsoft, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ .NET, เปเบ•เปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป€เบ›เบฑเบ™เบŠเบธเบ” Nuget. เบ‚เปโ€‹เปƒเบซเป‰โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เป‚เบ”เบโ€‹เบซเบเปเป‰โ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹:

  • CurrentThreadTaskScheduler โ€” เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบเบฐโ€‹เบ—เบนเป‰โ€‹เบ›เบฐโ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹
  • LimitedConcurrencyLevelTaskScheduler - เบˆเปเบฒโ€‹เบเบฑเบ”โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบซเบ™เป‰เบฒโ€‹เบงเบฝเบโ€‹เบ—เบตเปˆโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบžเป‰เบญเบกโ€‹เบเบฑเบ™โ€‹เป‚เบ”เบโ€‹เบžเบฒโ€‹เบฃเบฒโ€‹เบกเบดโ€‹เป€เบ•เบต Nโ€‹, เบ—เบตเปˆโ€‹เบ–เบทเบโ€‹เบเบญเบกโ€‹เบฎเบฑเบšโ€‹เปƒเบ™ constructor
  • OrderedTaskScheduler โ€” เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™ LimitedConcurrencyLevelTaskScheduler(1), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบงเบฝเบเบ‡เบฒเบ™เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš.
  • WorkStealingTaskScheduler - เบ›เบฐเบ•เบดเบšเบฑเบ” เบเบฒเบ™เบฅเบฑเบเป€เบฎเบฑเบ”เบงเบฝเบ เบงเบดเบ—เบตเบเบฒเบ™เปเบˆเบเบขเบฒเบเบงเบฝเบเบ‡เบฒเบ™. เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบงเบกเบฑเบ™เปเบกเปˆเบ™ ThreadPool เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเปƒเบ™ .NET ThreadPool เป€เบ›เบฑเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ static, เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบฑเบ‡เบซเบกเบปเบ”, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบเบฒเบ™ overloading เบซเบผเบทเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบœเบปเบ™เบ‚เป‰เบฒเบ‡เบ„เบฝเบ‡เปƒเบ™เบญเบตเบ. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบฒเป€เบซเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบ™เบฑเป‰เบ™. เบญเบฒเบ”เบˆเบฐเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ WorkStealingTaskSchedulers เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™เบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ ThreadPool เบญเบฒเบ”เบˆเบฐเบฎเบธเบเบฎเบฒเบ™เปเบฅเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เป€เบ”เบปเบฒเป„เบ”เป‰.
  • QueuedTaskScheduler โ€” เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบงเบฝเบโ€‹เบ‡เบฒเบ™โ€‹เบ•เบฒเบกโ€‹เบเบปเบ”โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เปเบ–เบงโ€‹เบšเบนโ€‹เบฅเบดโ€‹เบกเบฐโ€‹เบชเบดเบ”โ€‹
  • ThreadPerTaskScheduler โ€” เบชเป‰เบฒเบ‡เบเบฐเบ—เบนเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ Task เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เบกเบฑเบ™. เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™ unpredictable เบ—เบตเปˆเบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”.

เบกเบตเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบ”เบต เบšเบปเบ”เบ„เบงเบฒเบก เบเปˆเบฝเบงเบเบฑเบš TaskSchedulers เปƒเบ™ blog microsoft.

เบชเบณเบฅเบฑเบšเบเบฒเบ™เบ”เบตเบšเบฑเบเบ—เบตเปˆเบชเบฐเบ”เบงเบเบ‚เบญเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš Tasks, Visual Studio เบกเบตเปœเป‰เบฒเบ•เปˆเบฒเบ‡ Tasks. เบขเบนเปˆเปƒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบงเบฝเบเปเบฅเบฐเป€เบ•เบฑเป‰เบ™เป„เบ›เบซเบฒเป€เบชเบฑเป‰เบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”.

.NET: เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš multithreading เปเบฅเบฐ asynchrony. เบžเบฒเบเบ—เบต 1

PLinq เปเบฅเบฐเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบฐเบซเบ™เบฒเบ™

เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบ Tasks เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™, เบกเบตเบชเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเปƒเบ™ .NET: PLinq (Linq2Parallel) เปเบฅเบฐเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบฐเบซเบ™เบฒเบ™. เบ—เปเบฒเบญเบดเบ”เบชเบฑเบ™เบเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบฐเบซเบ™เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ Linq เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบซเบผเบฒเบเบซเบปเบงเบ‚เปเป‰. เบˆเปเบฒเบ™เบงเบ™เบเบฐเบ—เบนเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ WithDegreeOfParallelism. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบ, PLinq เปƒเบ™เบฎเบนเบšเปเบšเบšเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบกเบฑเบ™เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เบžเปเบเปˆเบฝเบงเบเบฑเบšเบžเบฒเบเปƒเบ™เบ‚เบญเบ‡เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบ„เบงเบฒเบกเป„เบงเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™, เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเปเบกเปˆเบ™เบ•เปเปˆเบฒเบซเบผเบฒเบ: เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ AsParallel เบเปˆเบญเบ™. เบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ Linq เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบซเป‰ PLinq เบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบเบปเบ™เป„เบเบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบ—เบตเปˆเบ™เบตเป‰ ะธ เบ—เบตเปˆเบ™เบตเป‰.

Parallel static class เบชเบฐเปœเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ iterating เป‚เบ”เบเบœเปˆเบฒเบ™ Foreach collection เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™, เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบš loop, เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเปเบ—เบ™เบซเบผเบฒเบเปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™ Invoke. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฐเบ—เบนเป‰เบ›เบฐเบˆเบธเบšเบฑเบ™เบˆเบฐเบ–เบทเบเบขเบธเบ”เบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบชเปเบฒเป€เบฅเบฑเบ”. เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฐโ€‹เบ—เบนเป‰โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบœเปˆเบฒเบ™ ParallelOptions เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ–เบฝเบ‡โ€‹เบชเบธเบ”โ€‹เบ—เป‰เบฒเบโ€‹. เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธ TaskScheduler เปเบฅเบฐ CancellationToken เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบทเบญเบเบ•เปˆเบฒเบ‡เป†.

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš

เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป€เบญเบเบฐเบชเบฒเบ™เบ‚เบญเบ‡เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเป€เบเบฑเบšเบเปเบฒเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™, เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบซเบผเบฒเบ. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเบฑเบ™เบ™เบฒเบ—เบดเบเบฒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบดเบกเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰ reproachfully เบšเบญเบเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบงเปˆเบฒเบซเบ™เป‰เบฒ 15 เป„เบ”เป‰เบซเบกเบปเบ”เป„เบ›, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบฐเบซเบผเบธเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบŠเบปเปˆเบงเบ„เบฒเบง. tricks เบญเบทเปˆเบ™เป†, APIs, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเบฒเบเบ•เบฒเปเบฅเบฐ pitfalls เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบกเป€เบญเบปเบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›.

เบ‚เปเป‰เบชเบฐเบซเบผเบธเบš:

  • เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฐเบ—เบนเป‰, asynchrony เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™เป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก.
  • .NET เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰
  • เบšเปเปˆเปเบกเปˆเบ™เบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบง, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบกเบฑเบเบˆเบฐเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบกเปเบฅเบฐเบ”เบปเบ, เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบ›เปˆเบฝเบ™ APIs เป€เบเบปเปˆเบฒเป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบ.
  • เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฐเบ—เบนเป‰เปƒเบ™ .NET เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เป‚เบ”เบเบซเป‰เบญเบ‡เบฎเบฝเบ™ Thread เปเบฅเบฐ ThreadPool
  • เบงเบดเบ—เบตเบเบฒเบ™ Thread.Abort, Thread.Interrupt, เปเบฅเบฐ Win32 API TerminateThread เปเบกเปˆเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบ เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเปเบ™เบฐเบ™เบณเปƒเบซเป‰เปƒเบŠเป‰. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบปเบ™เป„เบ CancellationToken
  • เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเป€เบ›เบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ„เปˆเบฒเปเบฅเบฐเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบˆเปเบฒเบเบฑเบ”. เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบเบฐเบ—เบนเป‰เบšเปเปˆเบซเบงเปˆเบฒเบ‡เบฅเปเบ–เป‰เบฒเป€เบซเบ”เบเบฒเบ™เบ„เบงเบ™เบซเบผเบตเบเป€เบงเบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰เบกเบฑเบ™เบชเบฐเบ”เบงเบเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบฎเบฝเบ™ TaskCompletionSource
  • เป€เบ„เบทเปˆเบญเบ‡เบกเบท .NET เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš เปเบฅเบฐเบเป‰เบฒเบงเปœเป‰เบฒเบ—เบตเปˆเบชเบธเบ”เบชเบณเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เบฐเปœเบฒเบ™ เปเบฅเบฐเปเบšเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™เปเบกเปˆเบ™ Tasks.
  • เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ c# async/await เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบฅเปเบ–เป‰เบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡
  • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เปเบˆเบเบขเบฒเบ Tasks เปƒเบ™เบ—เบปเปˆเบงเบซเบปเบงเบ‚เปเป‰เป‚เบ”เบเปƒเบŠเป‰ TaskScheduler-derived classes
  • เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ ValueTask เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฎเป‰เบญเบ™ เปเบฅเบฐ memory-traffic
  • เปœเป‰เบฒเบ•เปˆเบฒเบ‡เปœเป‰เบฒเบงเบฝเบ เปเบฅเบฐเบเบฐเบ—เบนเป‰เบ‚เบญเบ‡ Visual Studio เบชเบฐเปœเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเบณเบฅเบฑเบšเบเบฒเบ™เบ”เบตเบšเบฑเบเบซเบผเบฒเบเบเบฐเบ—เบนเป‰ เบซเบผเบท เบฅเบฐเบซเบฑเบ”เบšเปเปˆเบŠเบดเป‰เบ‡.
  • PLinq เป€เบ›เบฑเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบ—เบตเปˆโ€‹เป€เบขเบฑเบ™โ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบญเบฒเบ”โ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบžเบฝเบ‡โ€‹เบžเปโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เปเบซเบผเปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹, เปเบ•เปˆโ€‹เบ™เบตเป‰โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เป„เบ”เป‰โ€‹เป‚เบ”เบโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบเบปเบ™โ€‹เป„เบโ€‹เบเบฒเบ™โ€‹เปเบšเปˆเบ‡โ€‹เบ›เบฑเบ™โ€‹.
  • เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบ•เบญเบ™โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€ฆ

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™