.NETαŸ– αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ multithreading αž“αž·αž„ asynchrony αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1

αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž’αžαŸ’αžαž”αž‘αžŠαžΎαž˜αž“αŸ…αž›αžΎ Habr αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜ αž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž”αžŽαŸ’αžŠαžΆαž‰.

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ„αž™αž’αžŸαž˜αž€αžΆαž› αžŠαŸ„αž™αž˜αž·αž“αžšαž„αŸ‹αž…αžΆαŸ†αž›αž‘αŸ’αž’αž•αž›αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž“αž·αž„αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž¬αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ‚αž„αž…αŸ‚αž€αž€αžΆαžšαž„αžΆαžšαž’αŸ† αŸ— αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž’αž„αŸ’αž‚αž—αžΆαž–αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžœαžΆαž˜αžΆαž“αž˜αž»αž“αž€αžΆαžšαž˜αž€αžŠαž›αŸ‹αž“αŸƒαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαžαŸ’αžαž˜αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸαŸ‡αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŽαžΆαžŸαŸ‹αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2019 αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αžœαžΆαž™αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž™αž½αžšαžŠαŸƒαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 8-core Intel Core αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž„αž˜αž½αž™αžšαž™αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆ αž“αž·αž„αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” αž“αŸ…β€‹αž€αŸ’αž”αŸ‚αžšβ€‹αž“αŸ„αŸ‡β€‹αž˜αžΆαž“β€‹αž‘αžΌαžšαžŸαž–αŸ’αž‘β€‹αžšαžΆαž„β€‹αžŸαŸ’αžšαž½αž™β€‹αž”αž“αŸ’αžαž·αž…β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž‘αž·αž‰β€‹αž€αžΆαž›β€‹αž–αžΈβ€‹αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“β€‹αž†αŸ’αž“αžΆαŸ†β€‹αž˜αž»αž“ αžœαžΆβ€‹αž˜αžΆαž“β€‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 8-core αž“αŸ…β€‹αž›αžΎβ€‹αž™αž“αŸ’αžαž αŸ„αŸ‡αŸ” αž’αž“αž’αžΆαž“αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž‚αžΊαž–αŸ„αžšαž–αŸαž‰αž‘αŸ…αžŠαŸ„αž™αž’αžαŸ’αžαž”αž‘ αž“αž·αž„αžœαžΈαžŠαŸαž’αžΌ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž€αŸ„αžαžŸαžšαžŸαžΎαžšαž…αŸ†αž–αŸ„αŸ‡αžŸαŸ’αž˜αžΆαžαž αŸ’αžœαžΌαž“αž€αŸ†αž–αžΌαž›αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ†αž“αŸαŸ‡ αžŠαŸ‚αž›αž”αŸ†αž–αžΆαž€αŸ‹αž“αžΌαžœαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 16-coreαŸ” MS Azure αž•αŸ’αžαž›αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž½αžšαž€αŸ’αž”αžΆαž› 20 core αž“αž·αž„ RAM 128 TB αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαžαž·αž…αž‡αžΆαž„ $2 αž€αŸ’αž“αž»αž„αž˜αž½αž™αž˜αŸ‰αŸ„αž„αŸ” αž‡αžΆαž’αž€αž»αžŸαž› αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž’αžαž·αž”αžšαž˜αžΆ αž“αž·αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαžΆαž˜αž–αž›αž“αŸαŸ‡αžŠαŸ„αž™αž˜αž·αž“αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž”αžΆαž“αž‘αŸαŸ”

αžŸαŸαž–αŸ’αž‘

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš - αžœαžαŸ’αžαž» OS, αž…αž“αŸ’αž›αŸ„αŸ‡αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŠαžΆαž…αŸ‹αžŸαŸ’αžšαž™αžΆαž›, αž˜αžΆαž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αŸ”
αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ - αžœαžαŸ’αžαž» OS αžŠαŸ‚αž›αž‡αžΆαž’αž„αŸ’αž‚αž—αžΆαž–αžαžΌαž…αž”αŸ†αž•αž»αžαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† αž“αž·αž„αž’αž“αž’αžΆαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αŸ”
αž–αž αž»αž˜αž»αžαž„αžΆαžš - αž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž· OS αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαŸ”
αž–αž αž»αžŸαŸ’αž“αžΌαž› - αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹ processor αžŸαž˜αžαŸ’αžαž—αžΆαž–αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ’αž“αžΌαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™
αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž…αŸ’αžšαžΎαž“αŸ” - αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™ processors αž‡αžΆαž…αŸ’αžšαžΎαž“αžšαžΌαž”
αž–αž αž»αžαŸ’αžŸαŸ‚ - αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”
αž—αžΆαž–αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαŸ” - αž’αž“αž»αžœαžαŸ’αžαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžšαžΆαž„αž€αžΆαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž˜αž½αž™αž―αž€αžαžΆαž“αŸƒαž–αŸαž›αžœαŸαž›αžΆ
αž’αžŸαž˜αž€αžΆαž› - αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž˜αž·αž“αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡ αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αŸ”

αž˜αž·αž“αž˜αŸ‚αž“αž“αž·αž™αž˜αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž»αž‘αŸ’αž’αžαŸ‚αž›αŸ’αž’αž‘αŸ αž αžΎαž™αžαŸ’αž›αŸ‡αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž“αŸ’αžαŸ‚αž˜αž–αžΆαž€αŸ’αž™αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž’αŸ†αž–αžΈαž€αžΆαžšαž…αž˜αŸ’αž’αž·αž“αž’αžΆαž αžΆαžšαž’αžΆαž αžΆαžšαž–αŸαž›αž–αŸ’αžšαžΉαž€αž‘αŸ…αž–αžΆαž€αŸ’αž™αžŠαŸ‚αž›αžŽαŸ‚αž“αžΆαŸ†αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαŸ” αž€αžΆαžšαž…αž˜αŸ’αž’αž·αž“αž’αžΆαž αžΆαžšαž–αŸαž›αž–αŸ’αžšαžΉαž€αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αŸ”

αž–αŸαž›αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αž’αžΆαž αžΆαžšαž–αŸαž›αž–αŸ’αžšαžΉαž€ αžαŸ’αž‰αž»αŸ† (αžŸαŸŠαžΈαž—αžΈαž™αžΌ) αžαŸ’αž‰αž»αŸ†αž˜αž€αž•αŸ’αž‘αŸ‡αž”αžΆαž™ (αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαŸ”) αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αžŠαŸƒ 2 (αžŸαŸ’αž“αžΌαž›) αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αž”αžΆαž™ (IO) : oven, kettle, toaster, αž‘αžΌαž‘αžΉαž€αž€αž€αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž”αžΎαž€β€‹αž αŸ’αž‚αžΆαžŸ αžŠαžΆαž€αŸ‹β€‹αžαŸ’αž‘αŸ‡β€‹αž…αŸ€αž“β€‹αž›αžΎβ€‹αžœαžΆ αž αžΎαž™β€‹αž…αžΆαž€αŸ‹β€‹αž”αŸ’αžšαŸαž„β€‹αž…αžΌαž›β€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž…αžΆαŸ†β€‹αžœαžΆβ€‹αž‘αžΎαž„β€‹αž€αŸ†αžŠαŸ… (αž’αžŸαž˜αž€αžΆαž›, αž˜αž·αž“αž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹-IO-αžšαž„αŸ‹αž…αžΆαŸ†) αžαŸ’αž‰αž»αŸ†αž™αž€αžŸαŸŠαž»αžαž…αŸαž‰αž–αžΈαž‘αžΌαž‘αžΉαž€αž€αž€ αž αžΎαž™αž”αŸ†αž”αŸ‚αž€αžœαžΆαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž…αžΆαž“ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαž™αžœαžΆαžŠαŸ„αž™αžŠαŸƒαž˜αŸ’αžαžΆαž„ (αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž›αŸαž 1), αž“αž·αž„αž‘αžΈαž–αžΈαžš (αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž›αŸαž 2) αž€αžΆαž“αŸ‹αž…αžΆαž“ (αž’αž“αž’αžΆαž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€) αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αžΎαž€αž€αŸ†αžŸαŸ€αžœ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αžŠαŸƒαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹ (αž€αžΆαžšαž’αžαŸ‹αžƒαŸ’αž›αžΆαž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™) αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž“αŸαŸ‡αžαŸ’αž‘αŸ‡αž…αŸ€αž“αž‘αžΎαž„αž€αŸ†αžŠαŸ… (αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αž‘αŸ’αž’αž•αž›) αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αžΆαž€αŸ‹αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“ whipped αŸ” αžαŸ’αž‰αž»αŸ†β€‹αžˆαŸ„αž„β€‹αž‘αŸ…β€‹αžšαž€β€‹αž€αŸ†αžŸαŸ€αžœβ€‹αž”αžΎαž€β€‹αž αžΎαž™β€‹αž˜αžΎαž›β€‹αž‘αžΉαž€β€‹αžŠαŸ‚αž›β€‹αž–αž»αŸ‡β€‹αž€αŸ’αž“αž»αž„β€‹αž“αŸ„αŸ‡ (αž€αžΆαžšαž‘αž”αŸ‹αžŸαŸ’αž€αžΆαžαŸ‹-IO-αžšαž„αŸ‹αž…αžΆαŸ†) αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž“αŸαŸ‡αž‚αžΆαžαŸ‹αž’αžΆαž…αž›αžΆαž„αž…αžΆαž“αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž‚αžΆαžαŸ‹αž”αžΆαž“ whipped omelet αŸ”

αžαŸ’αž‰αž»αŸ†β€‹αž…αž˜αŸ’αž’αž·αž“β€‹αž’αžΌβ€‹αž˜αŸβ€‹αž‘αŸ‚αžβ€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ‚β€‹αŸ’β€‹αžŠαŸƒβ€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™β€‹αžαŸ’αž‰αž»αŸ†β€‹αž’αžαŸ‹β€‹αž˜αžΆαž“β€‹αž‘αŸ€αžβ€‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆβ€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αžœαžΆαž™β€‹αž–αž„β€‹αž’αžΌβ€‹αž˜αŸβ€‹αž‘αŸβ€‹αžβ€‹αž“αŸ„αŸ‡ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšβ€‹αŸ£β€‹αž”αžΆαž“β€‹αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αž€αŸ’αž“αž»αž„β€‹αž–αŸαž›β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αŸ– αž€αžΆαžšβ€‹αžœαžΆαž™β€‹αž–αž„β€‹αž’αžΌβ€‹αž˜αŸβ€‹αž‘αŸ‚αž αž€αžΆαž“αŸ‹β€‹αž…αžΆαž“β€‹αž‘αžΎαž„β€‹αž€αŸ†αžŠαŸ…β€‹αžαŸ’αž‘αŸ‡ αŸ” αžŸαŸŠαžΈαž—αžΈαž™αžΌαž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž›αžΏαž“αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš IO αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžαŸ‚αž„αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αžΊαž αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‡αžΆαžšαžΏαž™αŸ—αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‚αžΊαž€αžΆαžšαž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹αžŸαŸŠαžΈαž—αžΈαž™αžΌαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΈαž˜αž½αž™ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž‘αž‘αž½αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ IO αŸ”

αž€αžΆαžšαž”αž“αŸ’αžαž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αŸ–

  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαžšαŸ€αž”αž…αŸ† omelet αž˜αž½αž™ αžαŸ’αž‰αž»αŸ†αž€αŸαž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαž˜αŸ’αž›αŸ€αž€αž”αŸ†αž–αžΆαž€αŸ‹αž•αž„αžŠαŸ‚αžš αž“αŸαŸ‡αž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαž…αŸ’αžšαžΎαž“αŸ” αž…αŸ†αž“αž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αŸ– αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž˜αžΆαž“αž—αžΆαž–αž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž“αž»αžŸαŸ’αžŸαŸ”
  • αž•αŸ’αž‘αŸ‡αž”αžΆαž™αžŠαŸ‚αž›αž˜αžΆαž“αž˜αŸαž…αž»αž„αž—αŸ…αž‡αžΆαž…αŸ’αžšαžΎαž“αž§αž‘αžΆαž αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αž—αŸ„αž‡αž“αžΈαž™αžŠαŸ’αž‹αžΆαž“ - αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž–αž αž»αžŸαŸ’αž“αžΌαž›αŸ”
  • αž—αŸ„αž‡αž“αžΈαž™αžŠαŸ’αž‹αžΆαž“αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αžΈαž’αŸ’αž›αžΆαž’αžΆαž αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž•αŸ’αžŸαžΆαžšαž‘αŸ†αž“αžΎαž” - αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™

αž§αž”αž€αžšαžŽαŸ .NET

.NET αž‚αžΊαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ threads αžŠαžΌαž…αž‡αžΆαž‡αžΆαž˜αž½αž™αžšαžΏαž„αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αžΈαž˜αž½αž™αŸ— αžœαžΆαžŽαŸ‚αž“αžΆαŸ†αž§αž”αž€αžšαžŽαŸαžαŸ’αž˜αžΈαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αž½αž€αž‚αŸ αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžαŸ’αž˜αžΈαž“αŸƒαž—αžΆαž–αž’αžšαžΌαž”αžΈαž›αžΎαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ OS αŸ” αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž’αžšαžΌαž”αžΈ αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž‘αž»αž€αž±αž€αžΆαžŸ αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαž’αžšαžΌαž”αžΈαž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž…αž»αŸ‡αž‘αŸ…αž€αž˜αŸ’αžšαž·αžαž˜αž½αž™ αž¬αž…αŸ’αžšαžΎαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αŸ αžαžΆαž˜αž–αž·αžαžœαžΆαž”αžΎαž€αž‘αŸ’αžœαžΆαžšαž”αžΆαž‰αŸ‹αžαŸ’αž›αž½αž“αž―αž„αžŠαŸ„αž™αž€αžΆαŸ†αž—αŸ’αž›αžΎαž„αžαŸ’αž›αžΈ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αŸαž›αžαŸ’αž›αŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž€αž˜αŸ’αžš αžœαžΆαž’αžΆαž…αž‡αžΆαžœαž·αž’αžΈαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž—αžΆαž–αž’αžšαžΌαž”αžΈαŸ” .

αžαžΆαž˜αžšαž™αŸˆαž§αž”αž€αžšαžŽαŸ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž“αŸαž™αžαžΆαž‘αžΆαŸ†αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (APIs) αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ αž“αž·αž„αž€αž‰αŸ’αž…αž”αŸ‹αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈ αž€αŸαžŠαžΌαž…αž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ‚αž›αžŸαž˜αŸ’αžšαž½αž›αžŠαž›αŸ‹αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αž‰αŸ’αž αžΆαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΌαžŠαž–αž αž»αžαŸ’αžŸαŸ‚αŸ”

αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™

Thread class αž‚αžΊαž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž”αŸ†αž•αž»αžαž“αŸ…αž€αŸ’αž“αž»αž„ .NET αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ threadsαŸ” αž’αŸ’αž“αž€αžŸαžΆαž„αžŸαž„αŸ‹αž‘αž‘αž½αž›αž™αž€αžαŸ†αžŽαžΆαž„αž˜αŸ’αž“αžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžαŸ†αžŽαžΆαž„αž–αžΈαžšαŸ–

  • ThreadStart - αž‚αŸ’αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš
  • ParameterizedThreadStart - αž‡αžΆαž˜αž½αž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž˜αž½αž™αž“αŸƒαžœαžαŸ’αžαž»αž”αŸ’αžšαž—αŸαž‘αŸ”

αž”αŸ’αžšαžαž·αž—αžΌαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαžαž·αž—αžΌαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ ParametrizedThreadStart αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž αž“αŸ„αŸ‡αžœαžαŸ’αžαž»αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž™αž“αŸ’αžαž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸαžšαž–αŸαžαŸŒαž˜αžΆαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αžŽαžΆαž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αŸ” αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αž›αŸƒαž αžΎαž™αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžαŸ’αž›αž½αž“αž―αž„αž‚αžΊαž‡αžΆαžœαžαŸ’αžαž»αž’αŸ’αž„αž“αŸ‹αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž”αŸ‚αž„αž…αŸ‚αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† 1MB αž“αŸ…αž›αžΎαž‡αž„αŸ‹αž αžΎαž™αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™ 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 αŸ” αž˜αžΆαž“αžœαž·αž’αžΈαž˜αž½αž™ αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž™αž“αŸ’αžαž€αžΆαžšαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαžΆαž„αž€αŸ’αžšαŸ… αžŠαžΎαž˜αŸ’αž”αžΈαž αŸ…αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžƒαžΎαž‰αž€αžΆαžšαž αŸ…αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ‚αž˜αŸ’αžαž„αž‚αžαŸ‹αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαž‚αž½αžšαž±αŸ’αž™αž—αŸαž™αžαŸ’αž›αžΆαž…αž“αŸƒαž€αžΌαžŠαž€αŸαžšαžŠαŸ†αžŽαŸ‚αž› αž αžΎαž™αž€αžΆαžšαž›αžΎαž€αž‘αžΉαž€αž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαžœαžΆαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αŸ…αžαŸ‚αž‡αžΆαž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αŸ”

Kernel32.dll CreateThread

αž€αžΆαžšαž˜αžΎαž›αž“αž·αž„αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™

Threads αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž’αŸ’αž“αž€ αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž“αž·αž„αž€αŸ’αžšαž»αž˜ .NET αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αžΎαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž… Threads αž“αŸƒ Visual Studio αŸ” αžœαž·αž“αžŠαžΌαž“αŸαŸ‡αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αžαŸ‚αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ αž“αž·αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž”αŸ†αž”αŸ‚αž€αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžˆαŸ’αž˜αŸ„αŸ‡αž‡αž„αŸ‹ αž“αž·αž„αž’αžΆαž‘αž·αž—αžΆαž–αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž“αžΈαž˜αž½αž™αŸ—αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž αžΎαž™αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸαž‘αŸ…αž‡αžΆαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž’αžΆαž‘αž·αž—αžΆαž–αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ Thread αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž’αžΆαž‘αž·αž—αžΆαž–αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ αžŠαŸ‚αž› OC αž“αž·αž„ CLR αž“αžΉαž„αž™αž›αŸ‹αžαžΆαž‡αžΆαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž–αŸαž›αž”αŸ‚αž„αž…αŸ‚αž€αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžœαžΆαž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αŸ”

.NETαŸ– αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ multithreading αž“αž·αž„ asynchrony αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1

αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αž€αž·αž…αŸ’αž…αž€αžΆαžš

Task Parallel Library (TPL) αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„ .NET 4.0αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž‚αžΊαž‡αžΆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αž·αž„αž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αžŸαž˜αž€αžΆαž›αŸ” αž€αžΌαžŠαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž…αžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αžΆαž€αŸαžšαžŠαŸ†αžŽαŸ‚αž›αŸ” αž―αž€αžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒ TPL αž‚αžΊαž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž–αžΈ System.Threading.Tasks namespace αŸ” αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‚αžΊαž‡αžΆαž€αžΆαžšαž’αžšαžΌαž”αžΈαž›αžΎαžαŸ’αžŸαŸ‚αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαž—αžΆαžŸαžΆ C# αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžœαž·αž’αžΈαž†αžΎαžαž†αžΆαž™αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Tasks - async/await operatorsαŸ” αž‚αŸ„αž›αž‚αŸ†αž“αž·αžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αžŸαžšαžŸαŸαžšαž€αžΌαžŠαž’αžŸαž˜αž€αžΆαž› αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜ αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αžαž·αž…αžαž½αž…αž’αŸ†αž–αžΈαž€αžΆαžšαž„αžΆαžšαžαžΆαž„αž€αŸ’αž“αž»αž„αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αŸ’αžšαžΎαž–αž½αž€αžœαžΆ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αž·αž“αž”αž„αŸ’αž€αž€αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž™αžΌαžšαŸ” αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ async/await αž‚αžΊαž‡αžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αž˜αž½αž™ αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž’αžαŸ’αžαž”αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž™αŸ„αž‚αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • async αž‚αžΊβ€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž€αŸ‚αž”αŸ’αžšαŸ‚β€‹αž“αŸƒβ€‹αžœαž·αž’αžΈβ€‹αžŸαžΆβ€‹αžŸαŸ’αžšαŸ’αžβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž—αžΆαžšαž€αž·αž…αŸ’αž…β€‹αž¬β€‹αž˜αŸ„αžƒαŸˆ
  • αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžšαž„αŸ‹αž…αžΆαŸ†αž—αžΆαžšαž€αž·αž…αŸ’αž…αžŠαŸ‚αž›αž˜αž·αž“αžšαžΆαžšαžΆαŸ†αž„αŸ”

αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αžαŸ– αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ† αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αžΌαž‘αŸ… (αž˜αžΆαž“αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„) αž“αžΉαž„αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž αžΎαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› Task αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆ αž“αž·αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ (αžαžΆαž˜αž–αž·αž αžœαžΆαž“αžΉαž„αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž€αŸ’αž“αž»αž„αž€αžΆαžšαž“αž·αž™αžΆαž™αž”αžšαž·αž”αž‘αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž€αŸ’αžšαŸ„αž™β€‹αž‘αŸ€αž) αž“αžΉαž„β€‹αž”αž“αŸ’αžβ€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·β€‹αžœαž·αž’αžΈβ€‹αž“αŸαŸ‡β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž‘αŸ€αžαŸ” αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ .NET αž™αž“αŸ’αžαž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž•αž›αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž”αžΆαž“αžŸαžšαžŸαŸαžšαž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž˜αžΌαž› αžŠαŸ‚αž›αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αžšαžŠαŸ’αž‹ αž αžΎαž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž”αŸ†αžŽαŸ‚αž€αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžšαžŠαŸ’αž‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž’αžΆαž…αžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ asynс/await αž…αž„αž€αŸ’αžšαž„ αž“αž·αž„αž˜αžΎαž›αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ JetBrains dotPeek αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Compiler Generated Code αžŠαŸ‚αž›αž”αžΆαž“αž”αžΎαž€αŸ”

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž‡αž˜αŸ’αžšαžΎαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ TaskαŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αž˜αžΈαž˜αž½αž™αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ (αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αŸ” αž‚αŸαž„ (10000)) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αžΈαžœαž·αžαž–αž·αž αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αž‡αžΆαž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž”αŸ’αžšαžΎαžŸαŸŠαžΈαž—αžΈαž™αžΌαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ”

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
}

αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

  • LongRunning αž‚αžΊαž‡αžΆαžαž˜αŸ’αžšαž»αž™αž˜αž½αž™αžŠαŸ‚αž›αžαžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž“αŸ„αŸ‡αž‘αŸ αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž…αžΆαžšαžŽαžΆαž˜αž·αž“αž™αž€αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž…αŸαž‰αž–αžΈαž’αžΆαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž’αŸ’αž“αž€αžŠαž‘αŸƒαŸ”
  • AttachedToParent - αž—αžΆαžšαž€αž·αž…αŸ’αž…αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžαžΆαž˜αž‹αžΆαž“αžΆαž“αž»αž€αŸ’αžšαž˜αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‡αž˜αŸ’αžšαžΎαžŸαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αž“αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž’αžΆαž…αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž½αž™αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž αžΎαž™αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΌαž“αžšαž”αžŸαŸ‹αžœαžΆαŸ”
  • PreferFairness - αž˜αžΆαž“β€‹αž“αŸαž™β€‹αžαžΆβ€‹αžœαžΆβ€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžŸαžΎαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·β€‹αž˜αž»αž“β€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎβ€‹αž–αŸαž›β€‹αž€αŸ’αžšαŸ„αž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™αž›αž‘αŸ’αž’αž•αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αžΆαž‘αŸαŸ”

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΈαž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‚αžΊ CancellationToken αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž›αž»αž”αž…αŸ„αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžœαžΆαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž€αžΌαžŠαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ†αž–αŸαž‰αžŠαŸ„αž™αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž– CancellationTokenαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‘αŸ αž“αŸ„αŸ‡αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αŸ„αŸ‡αž”αž„αŸ‹αžŠαŸ‚αž›αž αŸ…αžαžΆ CancellationTokenSource object αž“αžΉαž„αž’αžΆαž…αž”αž‰αŸ’αžˆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸƒ Task αž˜αž»αž“αž–αŸαž›αžœαžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαž‡αžΆαžœαžαŸ’αžαž»αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž“αŸƒαž”αŸ’αžšαž—αŸαž‘ TaskScheduler αŸ” αžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡ αž“αž·αž„αž€αžΌαž“αž…αŸ…αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ‚αž€αž…αžΆαž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αŸ” αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž›αžΎαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž…αŸƒαžŠαž“αŸ’αž™αž–αžΈαž€αŸ’αžšαž»αž˜αŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αžΌαžŠαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžœαžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž˜αž½αž™ αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αžŠαžΌαž…αž‚αŸ’αž“αžΆ (αž‡αžΆαžšαžΏαž™αŸ—αžœαžΆαž˜αžΆαž“αž“αŸαž™αžαžΆαž“αŸ…αž›αžΎαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆ) αž‡αžΆαž€αžΌαžŠαž˜αž»αž“αž–αŸαž›αžšαž„αŸ‹αž…αžΆαŸ†αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆ async void αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαžœαžΆαž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ† αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž›αŸαžαž€αžΌαžŠαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αžΆαž“αž‘αŸαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž”αŸ‚αž”αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αŸ„αŸ‡αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαž‘αž”αŸ‹ Task αžœαž·αž‰αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆ async αž…αžΆαžαŸ‹αž‘αž»αž€αž‡αžΆαž˜αŸ„αžƒαŸˆαž‚αžΊαž‡αžΆαžšαžΏαž„αž’αž˜αŸ’αž˜αžαžΆαžŽαžΆαžŸαŸ‹αŸ– αž‡αžΆαž€αŸ’αž”αž½αž“ αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸ αž¬αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž—αŸ’αž›αžΎαž„ αž“αž·αž„αž—αŸ’αž›αŸαž…αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž•αŸ’αžαž›αŸ‹αž±αž€αžΆαžŸαž±αŸ’αž™αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž•αŸ’αžαž›αŸ‹αž›αž‘αŸ’αž’αž•αž›αž˜αž€αžœαž·αž‰ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ 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
}

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž‘αžΈαž˜αž½αž™ αž™αžΎαž„αžšαž„αŸ‹αž…αžΆαŸ†αž±αŸ’αž™αž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž˜αž·αž“αžšαžΆαžšαžΆαŸ†αž„αžαŸ’αžŸαŸ‚αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž‘αŸ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αž‘αŸ’αž’αž•αž›αžœαž·αž‰ αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αžœαžΆαž˜αžΆαž“αžšαž½αž…αž αžΎαž™ αžšαž αžΌαžαž‘αžΆαž›αŸ‹αžαŸ‚αžαŸ’αžŸαŸ‚αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž…αŸ„αž›αž‘αŸ…αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αžœαžΆαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΈαž–αžΈαžšαž™αžΎαž„αžšαžΆαžšαžΆαŸ†αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž αŸ…αžšαž αžΌαžαžŠαž›αŸ‹αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžŽαž“αžΆαŸ” αž“αŸαŸ‡αž˜αž·αž“αž›αŸ’αž’αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αžΎαž„αž”αžΆαž“αž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ αžŠαŸ‚αž›αž‡αžΆαž’αž“αž’αžΆαž“αžŠαŸαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž—αžΆαž–αž‘αŸ†αž“αŸαžšαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΌαžŠαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž™αžΎαž„αž αŸ…αž˜αžΆαž“αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ† αž αžΎαž™αž”αžšαž·αž”αž‘αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αžαŸ’αžŸαŸ‚αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžœαž·αž‰αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ αžšαž„αŸ‹αž…αžΆαŸ† αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž—αžΆαž–αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αŸ– αžαŸ’αžŸαŸ‚αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžšαž„αŸ‹αž…αžΆαŸ†αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αžŸαž˜αž€αžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αžŽαž“αžΆ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αžŸαž˜αž€αžΆαž›αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαŸ„αž™αž₯αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž˜αž½αž™αž‘αŸ€αžαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αŸ†αž αž»αžŸαžŠαŸαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ” αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž’αžŸαž˜αž€αžΆαž›αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎ async/await αž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŽαžΆαžŸαŸ‹ - αž–αž½αž€αž‚αŸαž˜αžΆαž“αž₯αžšαž·αž™αžΆαž”αž‘αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž€αžΌαžŠαžŠαŸ‚αž›αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžŠαŸ‚αžšαŸ” αžαžŽαŸˆβ€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž€αžΆαžšβ€‹αžšαž„αŸ‹αž…αžΆαŸ†β€‹αžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜β€‹αž‘αŸ…β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž˜αž½αž™ αž€αžΆαžšβ€‹αž›αžΎαž€β€‹αž›αŸ‚αž„β€‹αžŠαžΎαž˜β€‹αž”αŸ’αžšαŸ‚β€‹αž‘αŸ…β€‹αž‡αžΆ AggregateException αž–αŸ„αž›β€‹αž‚αžΊαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ’αžšαž—αŸαž‘ InnerException αž αžΎαž™αžŸαžšαžŸαŸαžšαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž…αžΆαž”αŸ‹αž˜αž½αž™ αž¬αž”αŸ’αžšαžΎαž€αžΆαžšαž…αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹ αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αž“αŸƒαž”αŸ’αž›αž»αž€αž…αžΆαž”αŸ‹αžŠαŸ‚αž›αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž—αž– C# αŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž‘αžΈαž”αžΈ αž“αž·αž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž˜αž·αž“αž›αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž“αž·αž„αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš WhenAny αž“αž·αž„ WhenAll αž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž„αŸ‹αž…αžΆαŸ†αž€αŸ’αžšαž»αž˜ Tasks αž–αž½αž€αžœαžΆαžšαž»αŸ†αž€αŸ’αžšαž»αž˜ Tasks αž‘αŸ…αž‡αžΆαž˜αž½αž™ αžŠαŸ‚αž›αž“αžΉαž„αž”αžΆαž‰αŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› Task αž–αžΈαž€αŸ’αžšαž»αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸαŸ‡αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„ αž¬αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ”

αž€αžΆαžšαž”αž‰αŸ’αžˆαž”αŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž•αŸ’αžŸαŸαž„αŸ— αžœαžΆαž’αžΆαž…αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αžˆαž”αŸ‹αž›αŸ†αž αžΌαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžœαžΆαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž˜αžΆαž“αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžšαžΏαž„αž“αŸαŸ‡αŸ” αžαŸ’αž“αžΆαž€αŸ‹ Thread αž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž–αžΈαžšαžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ– αž”αŸ„αŸ‡αž”αž„αŸ‹ ΠΈ αž•αŸ’αž’αžΆαž€. αž‘αžΈαž˜αž½αž™αž‚αžΊαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž’αŸ„αž™αž”αŸ’αžšαžΎαž‘αŸαž–αŸ’αžšαŸ„αŸ‡ αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž αŸ…β€‹αžœαžΆβ€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž…αŸƒαžŠαž“αŸ’αž™ αž€αŸ†αž‘αž»αž„β€‹αž–αŸαž›β€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αžŽαŸ‚αž“αžΆαŸ†β€‹αžŽαžΆβ€‹αž˜αž½αž™ αž€αžΆαžšβ€‹αž›αžΎαž€β€‹αž›αŸ‚αž„β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ„αŸ‡αž…αŸ„αž› ThreadAbortedException. αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αžšαŸ†αž–αžΉαž„β€‹αžαžΆβ€‹αž€αžΆαžšβ€‹αž›αžΎαž€β€‹αž›αŸ‚αž„β€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ„αŸ‡αž…αŸ„αž›β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž”αž„αŸ’αž€αžΎαž“β€‹αž’αžαŸαžšβ€‹αž…αŸ†αž“αž½αž“β€‹αž‚αžαŸ‹β€‹αž‘αŸβ€‹αž˜αŸ‚αž“αž‘αŸ? αž αžΎαž™αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαžœαž·αž’αžΈαž“αŸαŸ‡ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžŽαžΆαžŸαŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž–αžΆαžš CLR αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž”αŸ‚αž”αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αžΌαžŠ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž»αŸ†αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αŸ” Thread.BeginCriticalRegion, Thread.EndCriticalRegion. αž›αŸαžαž€αžΌαžŠαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αžŠαŸ„αž™αž€αžΆαžšαž αŸ…αž”αŸ‚αž”αž“αŸαŸ‡αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž“αŸαŸ‡ αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαŸ…αž“αŸƒαž€αžΌαžŠαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž”αŸ’αž›αž»αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αž‘αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž‘αž‘αŸαž“αŸ„αŸ‡αž‘αŸαŸ” Microsoft αž”αŸ†αž”αžΆαž€αŸ‹αž‘αžΉαž€αž…αž·αžαŸ’αžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž“αŸαŸ‡αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„ αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž˜αž·αž“αž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„ .net coreαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Interrupt αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‡αžΆαž„αŸ” αžœαžΆαž’αžΆαž…αžšαŸ†αžαžΆαž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŠαŸ„αž™αž˜αžΆαž“αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž˜αž½αž™αŸ” ThreadInterruptedException αž˜αžΆαž“αžαŸ‚αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž„αŸ‹αž…αžΆαŸ†αŸ” αžœαžΆαž…αžΌαž›αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡ αž–αŸαž›αž€αŸ†αž–αž»αž„αž–αŸ’αž™αž½αžš αžαžŽαŸˆαž–αŸαž›αžšαž„αŸ‹αž…αžΆαŸ† WaitHandle αž…αžΆαž€αŸ‹αžŸαŸ„ αž¬αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž‘αŸ… Thread.SleepαŸ”

αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΆαŸ†αž„αž–αžΈαžšαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαž‚αžΊαž˜αž·αž“αž›αŸ’αž’αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž˜αž·αž“αž’αžΆαž…αž‘αžΆαž™αž‘αž»αž€αž‡αžΆαž˜αž»αž“αž”αžΆαž“αŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαž”αŸ’αžšαžΎαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ CancellationToken αž“αž·αž„αžαŸ’αž“αžΆαž€αŸ‹ αž”αŸ’αžšαž—αž– CancellationToken. αž…αŸ†αž“αž»αž…αž‚αžΊαž“αŸαŸ‡αŸ– αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ CancellationTokenSource αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž’αŸ’αž“αž€αžŠαŸ‚αž›αž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αžœαžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž”αž‰αŸ’αžˆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš αž”αŸ„αŸ‡αž”αž„αŸ‹. αž˜αžΆαž“αžαŸ‚ CancellationToken αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αž˜αŸ’αž…αžΆαžŸαŸ‹ CancellationToken αž˜αž·αž“αž’αžΆαž…αž›αž»αž”αž…αŸ„αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž”αžΆαž“αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αž¬αž’αžαŸ‹αŸ” αž˜αžΆαž“αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αž”αŸŠαžΌαž›αžΈαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡αŸ” αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž€αžΆαžšαž›αž»αž”αž…αŸ„αž› αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αŸ„αŸ‡αž”αž„αŸ‹. αž€αŸ’αžšαŸ„αž™αž˜αž€αž‘αŸ€αžαž“αžΉαž„αž›αžΎαž€αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž˜αž½αž™αŸ” TaskCelledException αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αŸ„αŸ‡αž”αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž“αŸ…αž›αžΎαž§αž‘αžΆαž αžšαžŽαŸ CancellationToken αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‰αŸ‚αž€αŸ” αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžŽαŸ‚αž“αžΆαŸ†αž’αŸ„αž™αž”αŸ’αžšαžΎαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž€αŸ‚αž›αž˜αŸ’αž’αž›αžΎαž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαž˜αž»αž“ αžŠαŸ„αž™αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž–αŸαž‰αž›αŸαž‰ αž“αŸ…αž…αŸ†αžŽαž»αž…αžŽαžΆαžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αžΎαž€αž›αŸ‚αž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αŸ”

αž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸαžƒαŸ„αžšαžƒαŸ…αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αžˆαž”αŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‚αžΊαž€αžΆαžšαž αŸ…αž˜αž»αžαž„αžΆαžš Win32 API TerminateThread αŸ” αž₯αžšαž·αž™αžΆαž”αžαžšαž”αžŸαŸ‹ CLR αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž αŸ…αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž’αžΆαž…αž‘αžΆαž™αž‘αž»αž€αž‡αžΆαž˜αž»αž“αž”αžΆαž“αŸ” αž“αŸ…αž›αžΎ MSDN αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αŸ– "TerminateThread αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαžŠαŸαž‚αŸ’αžšαŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαž”αŸ†αž•αž»αžαŸ” β€œ

αž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„ API αž…αžΆαžŸαŸ‹αž‘αŸ… Task Based αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš FromAsync

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αžŸαŸ†αžŽαžΆαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ Tasks αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ† αž“αž·αž„αžˆαž”αŸ‹αž”αž„αŸ’αž€αž—αžΆαž–αž—αŸαž™αžšαž“αŸ’αž’αžαŸ‹αžŸαŸ’αž„αžΆαžαŸ‹αŸ—αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž—αžΆαž‚αž…αŸ’αžšαžΎαž“ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™ APIs αž…αžΆαžŸαŸ‹αŸ—αž…αŸ’αžšαžΎαž“αž‘αŸ αž‘αžΆαŸ†αž„αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈ αž“αž·αž„αž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΆαžšαž»αžŽαž€αž˜αŸ’αž˜αž€αžΆαž›αž–αžΈαž’αžαžΈαžαž€αžΆαž›αŸ” αžŸαŸ†αžŽαžΆαž„αž αžΎαž™ αžŠαŸ‚αž›αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžš .NET Framework αž”αžΆαž“αž˜αžΎαž›αžαŸ‚αž™αžΎαž„ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž‚αŸ„αž›αžŠαŸ…αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžαŸ‚αžšαž€αŸ’αžŸαžΆαžαŸ’αž›αž½αž“αž™αžΎαž„αž€αŸαžŠαŸ„αž™αŸ” αžαŸ’αžšαžΌαžœαž αžΎαž™αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“ .NET αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž€αžΌαžŠαžŠαŸ„αž™αž˜αž·αž“αžˆαžΊαž…αžΆαž”αŸ‹ αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžŸαž˜αž€αžΆαž›αž…αžΆαžŸαŸ‹ αžαž·αžαž‘αŸ…αž‡αž·αžαž›αŸαžαžαŸ’αž˜αžΈαŸ” αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸαž‚αžΊαž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš FromAsync αž“αŸƒ TaskFactory αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αžαŸ’αž‰αž»αŸ†αžšαž»αŸ†αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš async αž…αžΆαžŸαŸ‹αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ WebRequest αž€αŸ’αž“αž»αž„ Task αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž“αŸαŸ‡αŸ”

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

αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™αž’αŸ’αž“αž€αž‘αŸ†αž“αž„αž‡αžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž”αŸ‚αž”αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘αžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αž˜αŸ’αžšαŸ„αž„αž…αžΆαžŸαŸ‹αžŽαžΆαž˜αž½αž™αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž BeginDoSomething αžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš IAsyncResult αž“αž·αž„ EndDoSomething αžŠαŸ‚αž›αž‘αž‘αž½αž›αžœαžΆαŸ”

αž”αŸ†αž”αŸ’αž›αŸ‚αž„ API αž…αžΆαžŸαŸ‹αž‘αŸ…αž‡αžΆ Task Based αžŠαŸ„αž™αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹ TaskCompletionSource

αž§αž”αž€αžšαžŽαŸαžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž–αž·αž…αžΆαžšαžŽαžΆαž‚αžΊαžαŸ’αž“αžΆαž€αŸ‹ αž”αŸ’αžšαž—αž– TaskCompletion. αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž˜αž»αžαž„αžΆαžš αž‚αŸ„αž›αž”αŸ†αžŽαž„ αž“αž·αž„αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αžœαžΆαž’αžΆαž…αž“αžΉαž€αžƒαžΎαž‰αžαŸ’αž›αŸ‡αŸ—αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš RegisterWaitForSingleObject αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ ThreadPool αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαžαžΆαž„αž›αžΎαŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž»αŸ† APIs αž’αžŸαž˜αž€αžΆαž›αž…αžΆαžŸαŸ‹αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸ…αž€αŸ’αž“αž»αž„ Tasks αŸ”

αž’αŸ’αž“αž€αž“αžΉαž„αž“αž·αž™αžΆαž™αžαžΆαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž αžΎαž™αž’αŸ†αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš FromAsync αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ TaskFactory αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αž–αžΈαž”αŸ’αžšαžœαžαŸ’αžαž·αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‚αŸ†αžšαžΌαž’αžŸαž˜αž€αžΆαž›αž“αŸ…αž€αŸ’αž“αž»αž„ .net αžŠαŸ‚αž› Microsoft αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž› 15 αž†αŸ’αž“αžΆαŸ†αž€αž“αŸ’αž›αž„αž˜αž€αž“αŸαŸ‡αŸ– αž˜αž»αž“αž–αŸαž› Task-Based Asynchronous Pattern (TAP) αž˜αžΆαž“ Asynchronous Programming Pattern (APP) αžŠαŸ‚αž› αž‚αžΊαž’αŸ†αž–αžΈαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ αž›αž‘αŸ’αž’αž•αž› IAsync αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž”αž‰αŸ’αž…αž”αŸ‹DoSomething αžŠαŸ‚αž›αž‘αž‘αž½αž›αž™αž€αžœαžΆ αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸαžšαŸ’αžαž·αŸαžŠαŸ†αžŽαŸ‚αž›αž“αŸƒαž†αŸ’αž“αžΆαŸ†αž‘αžΆαŸ†αž„αž“αŸαŸ‡ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš FromAsync αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž›αŸ’αž’αž₯αžαžαŸ’αž…αŸ„αŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΌαžšαŸ—αž‘αŸ…αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαžŠαŸ„αž™ Event Based Asynchronous Pattern (EAP) αžŠαŸ‚αž›αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αž½αž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αžΎαž€αž‘αžΎαž„αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžŸαž˜αž€αžΆαž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”

TaskCompletionSource αž‚αžΊαž›αŸ’αž’αž₯αžαžαŸ’αž…αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž»αŸ† Tasks αž“αž·αž„ APIs αž…αžΆαžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž‡αž»αŸ†αžœαž·αž‰αž‚αŸ†αžšαžΌαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαŸ” αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ– αžœαžαŸ’αžαž»αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡αž˜αžΆαž“αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžŸαžΆαž’αžΆαžšαžŽαŸˆαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ Task αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαžΆαž˜αžšαž™αŸˆ SetResult, SetException αž‡αžΆαžŠαžΎαž˜αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ TaskCompletionSource αŸ” αž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžšαž„αŸ‹αž…αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡ αžœαžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž¬αž”αžšαžΆαž‡αŸαž™αžŠαŸ„αž™αž˜αžΆαž“αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αž˜αž½αž™αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡ TaskCompletionSource αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž“αŸ…αžαŸ‚αž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž€αžΌαžŠαž“αŸαŸ‡ αžŠαŸ‚αž› EAP API αž…αžΆαžŸαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αž€αŸ’αž“αž»αž„ Task αžŠαŸ„αž™αž”αŸ’αžšαžΎ TaskCompletionSourceαŸ– αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž€αžΎαžαž‘αžΎαž„ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž‘αŸ…αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž αžΎαž™αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ†αŸ” αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αž“αžΉαž„αž”αž“αŸ’αžαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαž‘αžΎαž„αžœαž·αž‰ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžΆαž“αž‘αž‘αž½αž›αžœαžαŸ’αžαž» αž›αž‘αŸ’αž’αž•αž›.

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) αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸαŸ‡αž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ„αž™αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž•αŸ’αž‘αž»αž€αžŠαŸ„αž™αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž’αžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ” αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž–αžΈαž›αž‘αŸ’αž’αž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž“αŸ…αž–αŸαž›αž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž”αž·αž…αžŠαžΌαž…αž‡αžΆ Long-PollingαŸ”

αžŸαžšαž»αž”αž˜αž€ αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž›αŸ’αž”αž·αž…αž“αŸαŸ‡αž‚αžΊαŸ– αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‘αž‘αž½αž›αž–αŸαžαŸŒαž˜αžΆαž“αž–αžΈ API αž’αŸ†αž–αžΈαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž“αŸ…αžαžΆαž„αžšαž”αžŸαŸ‹αžœαžΆ αžαžŽαŸˆαžŠαŸ‚αž› API αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž˜αž½αž™αž…αŸ†αž“αž½αž“αž˜αž·αž“αž’αžΆαž…αžšαžΆαž™αž€αžΆαžšαžŽαŸαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž”αžΆαž“αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αžΆαž…αžαŸ’αžšαž‘αž”αŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžœαž·αž‰αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆ APIs αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž“αŸƒ HTTP αž˜αž»αž“αž–αŸαž›αžŸαž˜αŸαž™αž“αŸƒ WebSocket αž¬αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž“αŸαŸ‡αŸ” αž’αžαž·αžαž·αž‡αž“αž’αžΆαž…αžŸαž½αžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αžαŸ’αž›αž½αž“αž―αž„αž˜αž·αž“αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‡αžΆαž˜αž½αž™αž’αžαž·αžαž·αž‡αž“αž”αžΆαž“αž‘αŸαŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž‚αžΊαž€αžΆαžšαžŸαŸ’αž‘αž„αŸ‹αž˜αžαž·αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αž„αŸ’αž€αžΎαžαž”αž“αŸ’αž‘αž»αž€αž”αž“αŸ’αžαŸ‚αž˜αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž“αž·αž„αž€αžΆαžšαž–αž“αŸ’αž™αžΆαž–αŸαž›αž”αž“αŸ’αžαŸ‚αž˜αž›αžΎαž˜αž’αŸ’αž™αž˜ TimerInterval / 2αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž›αŸ’αž”αž·αž…αž˜αž½αž™αžŠαŸ‚αž›αž αŸ…αžαžΆ Long Polling αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž αžΌαžαžŠαž›αŸ‹αž’αžŸαŸ‹αž–αŸαž›αž•αž»αžαž€αŸ†αžŽαžαŸ‹ αž¬αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„ αž“αŸ„αŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž˜αŸ’αžαž„αž‘αŸ€αžαŸ”

while(!eventOccures && !timeoutExceeded)  {

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

αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž”αŸ‚αž”αž“αŸαŸ‡β€‹αž“αžΉαž„β€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž–αžΈβ€‹αž—αžΆαž–β€‹αž’αžΆαž€αŸ’αžšαž€αŸ‹β€‹αž—αŸ’αž›αžΆαž˜αŸ—β€‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›β€‹αž…αŸ†αž“αž½αž“β€‹αž’αžαž·αžαž·αž‡αž“β€‹αžŠαŸ‚αž›β€‹αžšαž„αŸ‹αž…αžΆαŸ†β€‹αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸβ€‹αž€αžΎαž“αž‘αžΎαž„β€‹αž–αŸ’αžšαŸ„αŸ‡β€‹... αž’αžαž·αžαž·αž‡αž“αž”αŸ‚αž”αž“αŸαŸ‡αž“αžΈαž˜αž½αž™αŸ—αž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž‘αžΆαŸ†αž„αž˜αžΌαž›αžšαž„αŸ‹αž…αžΆαŸ†αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž˜αž½αž™αŸ” αž”αžΆαž‘/αž…αžΆαžŸ αž αžΎαž™αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž–αž“αŸ’αž™αžΆαžšαž–αŸαž› 1ms αž”αž“αŸ’αžαŸ‚αž˜αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αž‘αžΎαž„ αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αžœαžΆαž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αžΆαž“αŸ‹αžαŸ‚αž’αžΆαž€αŸ’αžšαž€αŸ‹αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž? αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αžŠαž€ Thread.Sleep(1) αž…αŸαž‰ αž“αŸ„αŸ‡αžŠαŸ„αž™αž₯αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸ αž™αžΎαž„αž“αžΉαž„αž•αŸ’αž‘αž»αž€αžŸαŸ’αž“αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ 100% αž‘αŸ†αž“αŸαžš αžŠαŸ„αž™αž”αž„αŸ’αžœαž·αž›αž€αŸ’αž“αž»αž„αžœαžŠαŸ’αžαžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎ TaskCompletionSource αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αžΌαžŠαž“αŸαŸ‡αž‘αžΎαž„αžœαž·αž‰αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž„αž›αžΎαŸ–

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/await αžŠαžΌαž…αž‡αžΆ yield return operator αž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ state αž–αžΈ method αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž object αžαŸ’αž˜αžΈ αžŠαŸ‚αž›αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž€αž˜αŸ’αžš αžœαžΆαž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž αžΆαž”αžΆαž“αŸ” αž€αžšαžŽαžΈαž“αŸαŸ‡αž’αžΆαž…αž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹ αž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžšαžΆαž”αŸ‹αž˜αŸ‰αžΊαž“ αž“αž·αž„αžšαžΆαž”αŸ‹αžšαž™αžšαžΆαž”αŸ‹αž–αžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžαžΆαž˜αžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžœαžΆαžαŸ’αžšαž‘αž”αŸ‹αž›αž‘αŸ’αž’αž•αž›αžŠαŸ„αž™αžšαŸ†αž›αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αžšαž„αŸ‹αž…αžΆαŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ„αŸ‡ .NET αž•αŸ’αžαž›αŸ‹αž§αž”αž€αžšαžŽαŸαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸαŸ‡ - αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ ValueTask αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŸαžΌαž˜αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆ: αž˜αžΆαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž™αžΎαž„αž…αžΌαž›αž‘αŸ…αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αžŽαžΆαžŸαŸ‹αŸ” αž˜αžΆαž“β€‹αžαž˜αŸ’αž›αŸƒβ€‹αžαŸ’αž›αŸ‡β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αžœαžΆ αž αžΎαž™β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αž™αžΎαž„β€‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž”αž‰αŸ’αž‡αžΌαž“β€‹αž–αž½αž€αžœαžΆβ€‹αž˜αž€β€‹αžœαž·αž‰ αž”αžΎβ€‹αž˜αž·αž“β€‹αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡β€‹αž‘αŸ αž™αžΎαž„β€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹ IO αž™αžΊαžβ€‹αžαŸ’αž›αŸ‡β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž™αž€β€‹αž–αž½αž€αžœαžΆαŸ” αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž’αŸ’αžœαžΎαž’αžŸαž˜αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž’αžŸαž˜αž€αžΆαž›αŸ” αžŠαžΌαž…αž“αŸαŸ‡ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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));
}

αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αžŠαž·αžαžŠαž›αŸ‹αž“αžΌαžœαž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž€αžΌαžŠαž“αŸαŸ‡αŸ– αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž½αž™ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αžŠαŸ„αž™αž’αžαŸ’αžαž“αŸαž™αž˜αž½αž™αŸ” αž›αŸαžαž€αžΌαžŠαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž˜αž·αž“αžαŸ’αžœαž›αŸ‹αžαžΆαž•αŸ’αž›αžΌαžœαžŽαžΆαžŠαŸ‚αž›αž€αžΌαžŠαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αŸ– ValueTask αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ C# αž“αžΉαž„αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αžαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž’αž˜αŸ’αž˜αžαžΆαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αžŠαŸ‚αžšαŸ”

TaskSchedulersαŸ– αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžš

API αž”αž“αŸ’αž‘αžΆαž”αŸ‹αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž–αž·αž…αžΆαžšαžŽαžΆαž‚αžΊαžαŸ’αž“αžΆαž€αŸ‹ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αž–αŸαž›β€‹αž—αžΆαžšαž€αž·αž…αŸ’αž… αž“αž·αž„αž“αž·αžŸαŸ’αžŸαž“αŸ’αž‘αžœαžαŸ’αžαž»αžšαž”αžŸαŸ‹αžœαžΆαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αžαžΆαž„αž›αžΎαžšαž½αž…αž αžΎαž™αžαžΆ TPL αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž—αžΆαžšαž€αž·αž…αŸ’αž…αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž›αžΆαž™αŸ” αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαž“αž…αŸ…αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ TaskScheduler αŸ” αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‚αŸ’αžšαž”αŸ‹αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αŸ” ParallelExtensionsExtrasαž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™ Microsoft αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒ .NET αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αž‡αžΆαž€αž‰αŸ’αž…αž”αŸ‹ Nuget αŸ” αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž–αž½αž€αž‚αŸαžαŸ’αž›αŸ‡αžŠαŸ„αž™αžŸαž„αŸ’αžαŸαž”αŸ–

  • CurrentThreadTaskScheduler - αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· Tasks αž“αŸ…αž›αžΎαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“
  • LimitedConcurrencyLevelTaskScheduler - αž€αŸ†αžŽαžαŸ‹αž…αŸ†αž“αž½αž“αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαžŠαŸ„αž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš N αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž™αž€αž“αŸ…αž€αŸ’αž“αž»αž„ constructor
  • αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰ TaskScheduler β€” αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž‡αžΆ LimitedConcurrencyLevelTaskScheduler(1) αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž›αŸ†αžŠαŸ„αž™αŸ”
  • αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž€αžΆαžšαž„αžΆαžš - αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž›αž½αž…αž€αžΆαžšαž„αžΆαžš αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž—αžΆαžšαž€αž·αž…αŸ’αž…αŸ” αžŸαŸ†αžαžΆαž“αŸ‹αžœαžΆαž‚αžΊαž‡αžΆ ThreadPool αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αŸ” αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžŠαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„ .NET ThreadPool αž‚αžΊαž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αž‹αž·αžαž·αžœαž“αŸ’αž αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αžΆαžšαž•αŸ’αž‘αž»αž€αž›αžΎαžŸαž‘αž˜αŸ’αž„αž“αŸ‹ αž¬αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž‡αžΆαž„αž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ†αž”αžΆαž€αžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž–αžΈαž˜αžΌαž›αž αŸαžαž»αž“αŸƒαž–αž·αž€αžΆαžšαž—αžΆαž–αž”αŸ‚αž”αž“αŸαŸ‡αŸ” αž“αŸ„αŸ‡αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ WorkStealingTaskSchedulers αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŠαŸ‚αž›αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ ThreadPool αž’αžΆαž…αž˜αžΆαž“αž—αžΆαž–αž†αŸαžœαž†αžΆαžœ αž“αž·αž„αž˜αž·αž“αž’αžΆαž…αž‘αžΆαž™αž‘αž»αž€αž‡αžΆαž˜αž»αž“αž”αžΆαž“αŸ”
  • QueuedTaskScheduler - αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αž“αž»αžœαžαŸ’αžαž—αžΆαžšαž€αž·αž…αŸ’αž…αžŠαŸ„αž™αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž…αŸ’αž”αžΆαž”αŸ‹αž‡αž½αžšαž’αžΆαž‘αž·αž—αžΆαž–
  • ThreadPerTaskScheduler - αž”αž„αŸ’αž€αžΎαžαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž›αžΎαžœαžΆαŸ” αž’αžΆαž…αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž™αžΌαžšαžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž‘αžΆαž™αž‘αž»αž€αž‡αžΆαž˜αž»αž“αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αŸ”

αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž›αŸ’αž’αŸ” αž’αžαŸ’αžαž”αž‘ αž’αŸ†αž–αžΈ TaskSchedulers αž“αŸ…αž›αžΎαž”αŸ’αž›αž»αž€αžšαž”αžŸαŸ‹ Microsoft αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸαžŠαŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αŸƒαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„ Tasks, Visual Studio αž˜αžΆαž“αž”αž„αŸ’αž’αž½αž… Tasks αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžš αž αžΎαž™αž›αŸ„αžαž‘αŸ…αž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αŸƒαž€αžΌαžŠαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

.NETαŸ– αž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ multithreading αž“αž·αž„ asynchrony αŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1

PLinq αž“αž·αž„αžαŸ’αž“αžΆαž€αŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›

αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎ Tasks αž“αž·αž„αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž–αž½αž€αžœαžΆ αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž–αžΈαžšαž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„ .NETαŸ– PLinq (Linq2Parallel) αž“αž·αž„αžαŸ’αž“αžΆαž€αŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αŸ” αž‘αžΈαž˜αž½αž™αžŸαž“αŸ’αž™αžΆαžαžΆαž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Linq αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž…αŸ’αžšαžΎαž“αŸ” αž…αŸ†αž“αž½αž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαž”αž“αŸ’αžαŸ‚αž˜ WithDegreeOfParallelism αŸ” αž‡αžΆαž’αž€αž»αžŸαž› αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹ PLinq αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αžšαž”αžŸαŸ‹αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž’αŸ†αž–αžΈαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αž“αž»αž„αž“αŸƒαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸ„αŸ‡αž‘αŸ αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αžαžαž˜αŸ’αž›αŸƒαž“αŸƒαž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αž‚αžΊαž‘αžΆαž”αžŽαžΆαžŸαŸ‹αŸ– αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš AsParallel αž‡αžΆαž˜αž»αž“αžŸαž·αž“αŸ” αžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž Linq αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžœαžΆαž’αžΆαž…αž”αž‰αŸ’αž‡αžΌαž“αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ… PLinq αž’αŸ†αž–αžΈαž›αž€αŸ’αžαžŽαŸˆαž“αŸƒαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž—αžΆαž‚αžαžΆαžŸαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αž“αŸ…αž‘αžΈαž“αŸαŸ‡ ΠΈ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αžαŸ’αž“αžΆαž€αŸ‹αž‹αž·αžαž·αžœαž“αŸ’αžαž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αž•αŸ’αžŠαž›αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž› Foreach αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ† αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αŸ’αžšαžαž·αž—αžΌαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž αŸ…αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αŸ” αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αžˆαž”αŸ‹αžšαž αžΌαžαžŠαž›αŸ‹αž€αžΆαžšαž‚αžŽαž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž…αŸ†αž“αž½αž“αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ ParallelOptions αž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ” αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ TaskScheduler αž“αž·αž„ CancellationToken αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‡αž˜αŸ’αžšαžΎαžŸαŸ”

αž€αžΆαžšαžšαž€αžƒαžΎαž‰

αž“αŸ…αž–αŸαž›αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž―αž€αžŸαžΆαžšαž“αŸƒαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžœαžΆ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž˜αžΆαž“αžœαžΆαž…αŸ’αžšαžΎαž“αž“αŸ„αŸ‡αž‘αŸαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αžœαžΆαž™αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžŸαŸ’αžαžΈαž”αž“αŸ’αž‘αŸ„αžŸαž”αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αžαžΆ αž‘αŸ†αž–αŸαžšαž‘αžΈ 15 αž”αžΆαž“αž‘αŸ… αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžŸαž„αŸ’αžαŸαž”αž›αž‘αŸ’αž’αž•αž›αž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αŸ” αž›αŸ’αž”αž·αž…αž•αŸ’αžŸαŸαž„αž‘αŸ€αž APIs αž§αž”αž€αžšαžŽαŸαž˜αžΎαž›αžƒαžΎαž‰ αž“αž·αž„αžšαžŽαŸ’αžαŸ…αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“:

  • αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαžΉαž„αž–αžΈαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ αž’αžŸαž˜αž€αžΆαž› αž“αž·αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž› αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž“αž’αžΆαž“αž“αŸƒαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž‘αŸ†αž“αžΎαž”αŸ”
  • .NET αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡
  • αž˜αž·αž“αž˜αŸ‚αž“αž–αž½αž€αžœαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž“αŸ„αŸ‡αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‡αžΆαžšαžΏαž™αŸ—αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αŸαžšαŸ’αžαž·αŸαžŠαŸ†αžŽαŸ‚αž›αž”αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžœαž·αž’αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ†αž”αŸ’αž›αŸ‚αž„ APIs αž…αžΆαžŸαŸ‹αŸ—αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αž…αŸ’αžšαžΎαž“αŸ”
  • αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž€αŸ’αž“αž»αž„ .NET αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αžαŸ’αž“αžΆαž€αŸ‹ Thread αž“αž·αž„ ThreadPool
  • αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Thread.Abort, Thread.Interrupt, αž“αž·αž„ Win32 API TerminateThread αž‚αžΊαž˜αžΆαž“αž‚αŸ’αžšαŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹ αž αžΎαž™αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αŸαŸ” αž‡αŸ†αž“αž½αžŸαž˜αž€αžœαž·αž‰ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžš CancellationToken
  • αž›αŸ†αž αžΌαžšαž‚αžΊαž‡αžΆαž’αž“αž’αžΆαž“αžŠαŸαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒ αž αžΎαž™αž€αžΆαžšαž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αžšαž”αžŸαŸ‹αžœαžΆαž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαŸ” αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αžšαžœαž›αŸ‹αžšαž„αŸ‹αž…αžΆαŸ†αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ€αžŸαžœαžΆαž„αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡ αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹ TaskCompletionSource
  • αž§αž”αž€αžšαžŽαŸ .NET αžŠαŸ‚αž›αž˜αžΆαž“αž’αž“αž»αž—αžΆαž– αž“αž·αž„αž‘αŸ†αž“αžΎαž”αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž—αžΆαž–αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆ αž“αž·αž„αž’αžŸαž˜αž€αžΆαž› αž‚αžΊαž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ”
  • αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžš c# async/await αž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαžšαž„αŸ‹αž…αžΆαŸ†αž˜αž·αž“αžšαžΆαžšαžΆαŸ†αž„
  • αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„β€‹αž€αžΆαžšβ€‹αž…αŸ‚αž€αž…αžΆαž™β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž“αŸ…β€‹αž‘αžΌαž‘αžΆαŸ†αž„β€‹αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™β€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ’αž“αžΆαž€αŸ‹β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž˜αž€β€‹αž–αžΈ TaskScheduler
  • αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ ValueTask αž’αžΆαž…αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– hot-paths αž“αž·αž„ memory-traffic
  • αžœαž·αž“αžŠαžΌ Tasks and Threads αžšαž”αžŸαŸ‹ Visual Studio αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž–αŸαžαŸŒαž˜αžΆαž“αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸαž€αžΌαžŠαž–αž αž»αžαŸ’αžŸαŸ‚ αž¬αž’αžŸαž˜αž€αžΆαž›
  • PLinq αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž’αŸ†αž–αžΈαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αžŸαž‡αž»αž›αžŠαŸ„αž™αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€
  • αž“αŸ…β€‹αž˜αžΆαž“β€‹αž‡αžΆβ€‹αž”αž“αŸ’αžβ€‹αž‘αŸ€αžβ€¦

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹