ืื ื ืืคืจืกื ืืช ืืืืืจ ืืืงืืจื ืขื Habr, ืฉืชืจืืืื ืคืืจืกื ืืชืืืื
ืืฆืืจื ืืขืฉืืช ืืฉืื ืืืืคื ืืกืื ืืจืื ื, ืืืื ืืืืืช ืืชืืฆืื ืืื ืืขืืฉืื, ืื ืืืืง ืขืืืื ืืืืื ืืื ืืกืคืจ ืืืืืืช ืืืืฆืขืืช ืืืชื, ืืื ืงืืื ืืคื ื ืืืคืขืช ืืืืฉืืื. ืขื ืืืคืขืชื, ืืฆืืจื ืืื ืืคื ืืืืืฉื ืืืื. ืืขืช, ืืฉื ืช 2019, ืื ื ืืงืืื ืืช ืืืืืจ ืืื ืขื ืืืฉื ื ืืื ืขื ืืขืื Intel Core 8 ืืืืืช, ืขืืื ืคืืขืืื ืืืชืจ ืืืื ืชืืืืืื ืืืงืืื, ืืขืื ืืืชืจ ืฉืจืฉืืจืื. ืืงืจืืช ืืงืื, ืืฉ ืืืคืื ืืขื ืขืืื, ืฉื ืงื ื ืืคื ื ืืื ืฉื ืื, ืืฉ ืื ืืขืื 8 ืืืืืช ืขื ืืกืืคืื. ืืฉืืืื ื ืืฉืืืื ืืืืื ืืืืืจืื ืืืกืจืืื ืื ืฉืืื ืืืืืจืื ืฉืืื ืืขืจืืฆืื ืืช ืกืืืจืืคืื ืื ืืืื ืฉื ืืฉื ื ืืืืืืื ืืขืืืื ืืขืื 16 ืืืืืช. MS Azure ืืกืคืงืช ืืืื ื ืืืจืืืืืืช ืขื ืืขืื 20 ืืืืืช ื-128 TB RAM ืืคืืืช ื-$2 ืืฉืขื. ืืืจืื ืืฆืขืจ, ืื ืืคืฉืจ ืืืืฅ ืืช ืืืงืกืืืื ืืืจืชืื ืืช ืืืื ืืื ืืืื ืืืืืช ืืกืืื ืื ืื ืืช ืืืื ืืจืืงืฆืื ืฉื ืืืืื.
ืืจืืื ืืืืืื
ืชืืืื - ืืืืืืงื ืืขืจืืช ืืืคืขืื, ืืจืื ืืชืืืืช ืืืืื, ืืืื ืฉืจืฉืืจืื.
ืคึผึฐืชึดืื - ืืืืืืงื OS, ืืืืืช ืืืืฆืืข ืืงืื ื ืืืืชืจ, ืืืง ืืชืืืื, ืืืืื ืืืืงืื ืืื ืืื ืืืืจืื ืืืฉืืืื ืืืจืื ืืชืื ืชืืืื.
ืจืืืื ืืฉืืืืช - ืืืคืืื ืืขืจืืช ืืืคืขืื, ืืืืืืช ืืืคืขืื ืืกืคืจ ืชืืืืืื ืื ืืื ืืช
ืจื ืืืืืช - ืชืืื ื ืฉื ืืืขืื, ืืืืืืช ืืืฉืชืืฉ ืืืกืคืจ ืืืืืช ืืขืืืื ื ืชืื ืื
ืจืืืื ืขืืืืืื - ืชืืื ื ืฉื ืืืฉื, ืืืืืืช ืืขืืื ืื ืืื ืืช ืขื ืืกืคืจ ืืขืืืื ืคืืืืช
ืจืืืื ืืฉืจืฉืืจืื - ืชืืื ื ืฉื ืชืืืื, ืืืืืืช ืืืคืืฅ ืขืืืื ื ืชืื ืื ืืื ืืกืคืจ ืฉืจืฉืืจืื.
ืึทืงืึผึดืืืึผืช - ืืืฆืืข ืืกืคืจ ืคืขืืืืช ืคืืืืช ืื ืืื ืืช ืืืืืืช ืืื
ืืกืื ืืจืื ืื - ืืืฆืืข ืคืขืืื ืืื ืืืชื ื ืืืฉืืืช ืขืืืื ืื; ื ืืชื ืืขืื ืืช ืชืืฆืืช ืืืืฆืืข ืืืืืจ ืืืชืจ.
ืืืืคืืจื
ืื ืื ืืืืืจืืช ืืืืืช ืืืืงื ืืงืืงืืช ืืืกืืจ ื ืืกืฃ, ืื ืืืกืืฃ ืืืืคืืจื ืขื ืืืฉืื ืืจืืืช ืืืงืจ ืืืื ืื ืฉืืืฆื ืจืฉืืืช. ืืืฉืื ืืจืืืช ืืืงืจ ืืืืืคืืจื ืื ืืื ืชืืืื.
ืืืื ืืื ืช ืืจืืืช ืืืืงืจ ืืืืงืจ ืื ื (CPU) ืื ื ืื ืืืืื (ืืืฉื). ืืฉ ืื 2 ืืืืื (ืืืืืช). ืืฉื ื ืืกืคืจ ืืืฉืืจืื ืืืืื (IO): ืชื ืืจ, ืงืืืงืื, ืืืกืืจ, ืืงืจืจ. ืื ื ืืืืืง ืืช ืืื, ืฉื ืขืืื ืืืืช ืืืืฆืง ืืชืืื ืฉืื ืืื ืืืืืช ืฉืืชืืื (ืืืืคื ืืกืื ืืจืื ื, Non-Blocking-IO-Wait), ืื ื ืืืฆืื ืืช ืืืืฆืื ืืืืงืจืจ ืืฉืืืจ ืืืชื ืืฆืืืช, ืืื ืืืจืฃ ืืืชื ืืื ืืืช (ืฉืจืฉืืจ ืืก' 1), ืืืฉื ืืื (ืฉืจืฉืืจ ืืก' 2) ืืืืืง ืืช ืืฆืืืช (ืืฉืื ืืฉืืชืฃ). ืขืืฉืื ืื ื ืจืืฆื ืืืืืืง ืืช ืืงืืืงืื, ืืื ืืื ืื ืืกืคืืง ืืืืื (ืฉืจืฉืืจ ืืจืขืื) ืืืื ืืื ืืืืืช ืืชืืืืช (ืืขืื ืืช ืืชืืฆืื) ืืืื ืื ื ืืืฆืง ืืช ืื ืฉืืงืฆืคืชื. ืื ื ืืืฉืื ืืช ืืื ืื ืืงืืืงืื ืืืืืืง ืืืชื ืืืชืืื ื ืืืืคืฉืืช ืืืื ืจืืชืืื ืื (ืืกืืื-IO-ืืืชื ื), ืืืจืืช ืฉืืืื ืืื ืืื ืืืื ืืื ืืฉืืืฃ ืืช ืืฆืืืช ืฉืื ืืงืฆืืฃ ืืช ืืืืืชื.
ืืืฉืืชื ืืืืชื ืืฉืชื ืืืืื ืืืื, ืืืื ืื ืืืชืจ, ืืื ืืืงืืื, ืืจืืข ืืืงืฆืคื ืฉื ืืืืืชื ืืืฆืขื 2 ืคืขืืืืช ืืืช ืืืช: ืืงืฆืคืช ืืืืืชื, ืืืืงืช ืืฆืืืช, ืืืืื ืืืืืช. ื-CPU ืืื ืืืืง ืืืืืจ ืืืืชืจ ืืืืฉื, IO ืืื ืื ืฉืืจืื ืืื ืืื, ืืืื ืืขืชืื ืงืจืืืืช ืคืชืจืื ืืขืื ืืื ืืืขืกืืง ืืช ื-CPU ืืืฉืื ืชืื ืืื ืงืืืช ื ืชืื ืื ื-IO.
ืืืฉื ืืืืืคืืจื:
- ืื ืืชืืืื ืืื ืช ืืืืชื, ืืืืชื ืื ืกื ืื ืืืืืืฃ ืืืืื, ืื ืชืืื ืืืืื ืืจืืืื ืืฉืืืืช. ื ืืืื ืก ืืฉืื: ืืืฉืืื ืืืืื ืืื ืืจืื ืืืชืจ ืืื ืฉืื.
- ืืืื ืขื ืืกืคืจ ืฉืคืื, ืืืฉื ืืืกืขืื - ืืืฉื ืจื ืืืืืช.
- ืืกืขืืืช ืจืืืช ืืืชืื ืืืื ืืืจืื ืงื ืืืช - ืืืื ืกื ืืจ
ืืื NET
NET ืืืื ืืขืืืื ืขื ืฉืจืฉืืจืื, ืืื ืขื ืืจืื ืืืจืื ืืืจืื. ืขื ืื ืืจืกื ืืืฉื, ืืื ืืฆืืื ืืืชืจ ืืืืชืจ ืืืื ืืืฉืื ืืขืืืื ืืืชื, ืฉืืืืช ืืืฉืืช ืฉื ืืคืฉืื ืขื ืืืื ืืขืจืืช ืืืคืขืื. ืืืฉืจ ืขืืืืื ืขื ืื ืืืช ืืคืฉืืืช, ืืคืชืื ืืกืืจืช ืืฉืชืืฉืื ืืืืฉื ืฉืืืชืืจื ืืช ืืืืืื ืืช, ืืขืช ืฉืืืืฉ ืืืคืฉืื ืืจืื ืืืืื, ืืจืืช ืจืื ืืืช ืื ืืืชืจ ืืืื. ืืจืื ืื ืื ืืืจืื, ืืืขืฉื ืื ืคืืชื ืืช ืืืืช ืืืจืืช ืืขืฆืื ืืจืื ืขื ืจืืื ืฆืื, ืืื ืืคืขืืื, ืืืงืจืื ื ืืืจืื, ืื ืขืฉืืื ืืืืืช ืืืจื ืืืืืื ืืคืชืืจ ืืขืื ืฉืื ื ืคืชืจืช ืืจืืช ืืืคืฉืื ืื ืืืืืช .
ืืืืื, ืื ื ืืชืืืื ืื ืืืืฉืงื ืชืื ืืช ืืืฉืืืื (API) ืืืกืืคืงืื ืขื ืืื ืืืกืืจืช ืืื ืืืืืืืช ืฉื ืฆื ืฉืืืฉื, ืืื ืื ืืคืชืจืื ืืช ืชืืื ื ืฉืืืื ืืืคืฉืืื ืืช ืืืืคืืฉ ืืืจ ืื ืืขืื ืืงืฉืืจื ืืงืื ืืจืืื ืืืืื.
ืคืืชื ืฉืจืฉืืจ
ืืืืืงื Thread ืืื ืืืืืงื ืืืกืืกืืช ืืืืชืจ ื-.NET ืืขืืืื ืขื ืฉืจืฉืืจืื. ืืื ืื ืืงืื ืืื ืืฉื ื ื ืฆืืืื:
- ThreadStart - ืืื ืคืจืืืจืื
- ParametrizedThreadStart - ืขื ืคืจืืืจ ืืื ืืกืื ืืืืืืงื.
ืื ืฆืื ืืืืฆืข ืืฉืจืฉืืจ ืืืืฉ ืฉื ืืฆืจ ืืืืจ ืงืจืืื ืืืชืืื Start.ืื ื ืฆืื ืืกืื ParametrizedThreadStart ืืืขืืจ ืืื ืื, ืื ืืฉ ืืืขืืืจ ืืืืืืงื ืืืชืืื Start. ืื ืื ืื ืื ื ืืืฅ ืืื ืืืขืืืจ ืื ืืืืข ืืงืืื ืืืจื. ืจืืื ืืฆืืื ืฉืืฆืืจืช ืฉืจืฉืืจ ืืื ืคืขืืื ืืงืจื, ืืืฉืจืฉืืจ ืขืฆืื ืืื ืืืืืืงื ืืื, ืืคืืืช ืืืื ืฉืืื ืืงืฆื 1MB ืฉื ืืืืจืื ืขื ืืืืกื ืืช ืืืืจืฉ ืืื ืืจืืงืฆืื ืขื OS API.
new Thread(...).Start(...);
ืืืืงืช ThreadPool ืืืืฆืืช ืืช ืืจืขืืื ืฉื ืืจืืื. ื-.NET, ืืืืจ ืืฉืจืฉืืจืื ืืื ืืชืืืช ืื ืืกื, ืืืืคืชืืื ืืืืงืจืืกืืคื ืืฉืงืืขื ืืืืฆืื ืจืืื ืืื ืืืืื ืฉืืื ืคืืขื ืืฆืืจื ืืืืืืช ืืืืืื ืจืื ืฉื ืชืจืืืฉืื.
ืืืฉื ืืืื:
ืืจืืข ืืคืขืืช ืืืคืืืงืฆืื, ืืื ืืืฆืจืช ืืกืคืจ ืฉืจืฉืืจืื ืืจืงืข ืืจืงืข ืืืกืคืงืช ืืช ืืืืืืช ืืงืืช ืืืชื ืืฉืืืืฉ. ืื ืืฉืชืืฉืื ืืืืืื ืชืืืคืื ืืืืกืคืจืื ืืืืืื, ืืืืืจ ืืชืจืื ืืื ืืขื ืืช ืขื ืืฆืจืืื ืฉื ืืืชืงืฉืจ. ืืืฉืจ ืืื ืฉืจืฉืืจืื ืคื ืืืื ืืืจืืื ืืืื ืื ืืื, ืืื ืืืื ืขื ืฉืืื ืืืืืื ืืืืืจ, ืื ืืฆืืจ ืืื ืืืฉ. ืืืื ื ืืืข ืฉืืืืจ ืืฉืจืฉืืจืื ืืฆืืื ืืืื ืคืขืืืืช ืงืฆืจืืช ืืืื ืืืื ื ืืชืืื ืืคืขืืืืช ืืคืืขืืืช ืืฉืืจืืชืื ืืืืจื ืื ืคืขืืืช ืืืคืืืงืฆืื.
ืืื ืืืฉืชืืฉ ืืฉืจืฉืืจ ืืืืืืจ, ืงืืืืช ืฉืืืช 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
ืฆืคืืื ืื ืืคืื ืืืืื ืืืฉืืืืืช
ื ืืชื ืืืฆืื ืืช ืืฉืจืฉืืจืื ืฉื ืืฆืจื ืขื ืืื, ืืช ืื ืจืืืื ืืฆื ืืฉืืืฉื ืืืืืจ ื-.NET ืืืืื ื-Threads ืฉื Visual Studio. ืืืื ืื ืืฆืื ืืืืข ืขื ืฉืจืฉืืจ ืจืง ืืืฉืจ ืืืืฉืื ื ืืฆื ืชืืช ื ืืคืื ืืืืื ืืืืฆื ืืคืกืงื. ืืื ืืชื ืืืื ืืืฆืื ืื ืืืืช ืืช ืฉืืืช ืืืืกื ืืช ืืืช ืกืืจื ืืขืืืคืืืืช ืฉื ืื ืฉืจืฉืืจ, ืืืขืืืจ ืืืชืืจ ืืืืื ืืฉืจืฉืืจ ืกืคืฆืืคื. ืืืืฆืขืืช ืืืืคืืื Priority ืฉื ืืืืืงื Thread, ื ืืชื ืืืืืืจ ืืช ืืขืืืคืืช ืฉื thread, ืืฉืจ ื-OC ืื-CLR ืืชืคืกื ืืืืืฆื ืืขืช ืืืืงืช ืืื ืืืขืื ืืื ืฉืจืฉืืจืื.
ืกืคืจืืืช ืืงืืืืืช ืืฉืืืืช
ืกืคืจืืืช ืืฉืืืืช ืืงืืืื (TPL) ืืืฆืื ื-.NET 4.0. ืขืืฉืื ืื ืืกืื ืืจื ืืืืื ืืขืืงืจื ืืขืืืื ืขื ืืกืื ืืจืื ืื. ืื ืงืื ืืืฉืชืืฉ ืืืืฉื ืืฉื ื ืืืชืจ ื ืืฉื ืืืืจืฉืช. ืืืืืื ืืืกืืกืืช ืฉื TPL ืืื ืืืืงื Task ืืืจืื ืืฉืืืช System.Threading.Tasks. ืืฉืืื ืืื ืืคืฉืื ืขื ืืื. ืขื ืืืจืกื ืืืืฉื ืฉื ืฉืคืช C#, ืงืืืื ื ืืจื ืืืื ืืืช ืืขืืื ืขื Tasks - ืืืคืจืืืจืื ืืกืื ืืจืื ืืื/ืืืชืื ืื. ืืืืฉืืื ืืืื ืืคืฉืจื ืืืชืื ืงืื ืืกืื ืืจืื ื ืืืืื ืืื ืคืฉืื ืืกืื ืืจืื ื, ืื ืืคืฉืจ ืืคืืื ืืื ืฉืื ืขื ืืื ื ืืืขืื ืฉื โโืคืขืืืชื ืืคื ืืืืช ืฉื ืฉืจืฉืืจืื ืืืชืื ืืคืืืงืฆืืืช ืฉืืฉืชืืฉืืช ืืื, ืืคืืืงืฆืืืช ืฉืื ืงืืคืืืช ืืขืช ืืืฆืืข ืคืขืืืืช ืืจืืืืช. ืืฉืืืืฉ ื-async/wait ืืื ื ืืฉื ืืืืืจ ืืื ืื ืืคืืื ืืืื ืืืืจืื, ืืื ืื ืกื ืืืืื ืืช ืขืืงืจื ืืืื ืืฉืคืืื:
- async ืืื ืืฉื ื ืฉื ืฉืืื ืืืืืืจื Task ืื void
- and await ืืื ืืคืขืื ืื ืืืกื ืืฉืืื ืืืื.
ืฉืื: ืืคืขืื ืืืืชื ื, ืืืงืจื ืืืืื (ืืฉ ืืจืืืื), ืืฉืืจืจ ืืช ืฉืจืฉืืจ ืืืืฆืืข ืื ืืืื, ืืืืฉืจ ืืืฉืืื ืชืกืืื ืืช ืืืฆืืขื, ืืืช ืืฉืจืฉืืจ (ืืืขืฉื, ื ืืื ืืืชืจ ืืืืจ ืืช ืืืงืฉืจ , ืื ืขื ืื ืืืืฉื) ืืืฉืื ืืืืฆืืข ืืฉืืื. ืืชืื NET, ืื ืื ืื ืื ืืืืฉื ืืืืชื ืืืคื ืืื ืืืืจืช ืชืฉืืื, ืืืฉืจ ืืฉืืื ืืืชืืื ืืืคืืช ืืืืืงื ืฉืืื, ืฉืืื ืืืื ืช ืืฆืืื ืื ืืชื ืช ืืืืฆืืข ืืืืงืื ื ืคืจืืื ืืืชืื ืืืฆืืื ืืื. ืื ืื ืฉืืขืื ืืื ืืืื ืืืชืื ืื ืงืื ืคืฉืื ืืืืฆืขืืช asynั/await, ืงืืืคืืืฆืื ืืืฆืื ืฉื ืืืืืื ืืืืฆืขืืช JetBrains dotPeek ืขื ืงืื ืืืืจ ืืืคืขื.
ืืืื ื ืกืชืื ืขื ืืคืฉืจืืืืช ืืืคืขืื ืืฉืืืืฉ ื-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 ืชืืื ืืขืฆืืจ ืืช ืืืฆืืข ืืืฉืืื ืจืง ืืคื ื ืฉืืื ืืชืืืื.
ืืคืจืืืจ ืืืืจืื ืืื ืืืืืืงื ืืชืืื ืืกืื TaskScheduler. ืืืืงื ืื ืืฆืืฆืืื ื ืืขืื ืืฉืืื ืืืกืืจืืืืืช ืืืคืฆืช ืืฉืืืืช ืขื ืคื ื ืฉืจืฉืืจืื; ืืืจืืจืช ืืืื, ืืืฉืืื ืชืชืืฆืข ืขื ืฉืจืฉืืจ ืืงืจืื ืืืืืืจ.
ืืืืคืจืืืจ await ืืืื ืขื ืืืฉืืื ืฉื ืืฆืจื, ืืืืืจ ืืงืื ืฉื ืืชื ืืืจืื, ืื ืืฉ ืืื, ืืชืืฆืข ืืืืชื ืืงืฉืจ (ืืขืืชืื ืงืจืืืืช ืื ืืืืจ ืืืืชื ืฉืจืฉืืจ) ืืื ืืงืื ืฉืืคื ื await.
ืืฉืืื ืืกืืื ืช ืืืกืจืช ืกืื ืืจืื, ืื ืฉืืืืจ ืฉืืื ืืืืื ืืืฉืชืืฉ ืืืืคืจืืืจ await, ืื ืืงืื ืืืชืงืฉืจ ืื ืืืื ืืืืืช ืืืืฆืืข. ืื ืืฉ ืฆืืจื ืืชืืื ื ืืื, ืืฉืืื ืืืืืช ืืืืืืจ ืืช ืืืฉืืื. ืฉืืืืช ืฉืกืืื ื ืืืืืืช ืืกืื ืืจืื ืื ื ืคืืฆืืช ืืืื: ืืืื, ืืื ืื ืืืคืื ืืืจืืขืื ืื ืฉืืืืช ืืืจืืช ืฉืขืืืืืช ืขื ืขืืงืจืื ืืืฉ ืืฉืื. ืื ืืชื ืฆืจืื ืื ืจืง ืืชืช ืืช ืืืืืื ืืช ืืืืืช ืขื ืกืืฃ ืืืืฆืืข, ืืื ืื ืืืืืืจ ืืช ืืชืืฆืื, ืื ืืชื ืฆืจืื ืืืฉืชืืฉ ืืืฉืืื.
ืืืฉืืื ืฉืฉืืืช StartNew ืืืืืจื, ืืื ืื ืืื ืืืช ืืืจืช, ืืชื ืืืื ืืงืจืื ืืืชืืื ConfigureAwait ืขื ืืคืจืืืจ false, ืืื ืืืืฆืืข ืืืจื await ืืืฉืื ืื ืืืงืฉืจ ืฉื ืืื, ืืื ืขื ืงืื ืืงืกื ืฉืจืืจืืชื. ืืฉ ืืขืฉืืช ืืืช ืชืืื ืืืฉืจ ืืงืฉืจ ืืืืฆืืข ืืื ื ืืฉืื ืขืืืจ ืืงืื ืืืืจ ืืืืชื ื. ืืืื ืื ืืืืฆื ืฉื 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
}
ืืืืืื ืืจืืฉืื ื, ืื ื ืืืชืื ืื ืืืฉืืื ืฉื ืืืฉืืื ืืืื ืืืกืื ืืช ืืฉืจืฉืืจ ืืืชืงืฉืจ; ื ืืืืจ ืืขืื ืืช ืืชืืฆืื ืจืง ืืืฉืจ ืืื ืืืจ ืฉื; ืขื ืื, ืืฉืจืฉืืจ ืืืชืงืฉืจ ื ืฉืืจ ืืืืฉืืจืื.
ืืืคืฉืจืืช ืืฉื ืืื ืืืกืืื ืืช ืฉืจืฉืืจ ืืงืืจืืื ืขื ืืืืฉืื ืชืืฆืืช ืืฉืืื. ืื ืจืข ืื ืจืง ืืฉืื ืฉืืืฉื ื ืฉืจืฉืืจ, ืืฉืื ืื ืืงืจ ืฉื ืืชืืื ืืช, ืืืืื ืคืฉืืื, ืืื ืื ืืฉืื ืฉืื ืืงืื ืฉื ืืฉืืื ืฉืื ื ืงืืจืืื ืื ืืืื, ืืืงืฉืจ ืืกื ืืจืื ืืืืื ืืืืืจ ืืฉืจืฉืืจ ืืงืืจื ืืืืจ await, ืื ื ืงืื ืืืื ืกืชืื: ืฉืจืฉืืจ ืืงืืจื ืืืชืื ืืืื ืฉืืชืืฆืื ืฉื ืืฉืืื ืืืกืื ืืจืื ืืช ืืืืฉืืช, ืืฉืืื ืื-ืกืื ืืจืื ืืช ืื ืกื ืืฉืืื ืืืืฉืื ืืช ืืืฆืืขื ืืฉืจืฉืืจ ืืงืืจื.
ืืืกืจืื ื ืืกืฃ ืฉื ืืืฉื ืื ืืื ืืืคืื ืืฉืืืืืช ืืกืืื. ืืขืืืื ืืื ืฉืงื ืืืื ืืืคื ืืฉืืืืืช ืืงืื ืืกืื ืืจืื ื ืืขืช ืฉืืืืฉ ื-async/wait - ืื ืืชื ืืืืช ืืืชื ืืืจ ืืืืื ืืงืื ืืื ืกืื ืืจืื ื. ืืขืื ืฉืื ื ืืื ืืืจืืฉ ืฉืืื ืกืื ืืจืื ื ืขื ืืฉืืื, ืืืจืื ืืืงืืจื ืืืคื ื-AggregateException, ืืืืืจ. ืืื ืืืชืืืื ืขื ืืืจืืื, ืชืฆืืจืื ืืืืื ืืช ืกืื InnerException ืืืืชืื ืื ืืฉืจืฉืจ ืืช ืขืฆืืื ืืชืื ืืืืง catch ืืื ืื ืืืฉืชืืฉ ื-catch when construct, ืืืงืื ืืฉืจืฉืจืช ืืืืงื ื-catch ืืืืืจืช ืืืชืจ ืืขืืื C#.
ืื ืืืืืืืืช ืืฉืืืฉืืช ืืืืืจืื ื ืืกืืื ืืช ืืืจืืขืืช ืืืืชื ืกืืื ืืืืืืืช ืืช ืื ืืืชื ืืืขืืืช.
ืืฉืืืืช WhenAny ื-WhenAll ื ืืืืช ืืืืืื ืืืืชื ื ืืงืืืฆืช ืืฉืืืืช; ืื ืขืืืคืืช ืงืืืฆืช ืืฉืืืืช ืืืื, ืืฉืจ ืืืคืขื ืื ืืืฉืจ ืืฉืืื ืืืงืืืฆื ืชืืคืขื ืืจืืฉืื ื, ืื ืืืฉืจ ืืืื ืืฉืืืื ืืช ืืืืฆืืข ืฉืืื.
ืขืฆืืจืช ืฉืจืฉืืจืื
ืืกืืืืช ืฉืื ืืช, ืืืชืื ืฉืืืื ืฆืืจื ืืืคืกืืง ืืช ืืืจืืื ืืืืจ ืชืืืืชื. ืืฉื ื ืืกืคืจ ืืจืืื ืืขืฉืืช ืืืช. ืืืืืงื Thread ืืฉ ืฉืชื ืฉืืืืช ืืขืืืช ืฉื ืืชืืื: ืืคืื ะธ ืืืคืจืืข. ืืจืืฉืื ืืืื ืื ืืืืืฅ ืืฉืืืืฉ, ืื ืืืืจ ืืชืงืฉืจืืช ืืืื ืืื ืจืืข ืืงืจืื, ืืืืื ืขืืืื ืฉื ืื ืืืจืื, ืชืืืจืง ืืจืืื ThreadAbortedException. ืืชื ืื ืืฆืคื ืฉืืืฆื ืืจืื ืืื ืืฉืืืืืืื ืื ืืฉืชื ื ืืกืคืจ ืฉืื, ื ืืื? ืืืืฉืจ ืืฉืชืืฉืื ืืฉืืื ืื, ืืื ืืฆื ืืืื ืืืืชื. ืื ืืชื ืฆืจืื ืืื ืืข ืื-CLR ืืืฆืืจ ืืจืื ืืื ืืงืืข ืืกืืื ืฉื ืงืื, ืืชื ืืืื ืืขืืืฃ ืืืชื ืืฉืืืืช Thread.BeginCriticalRegion, Thread.EndCriticalRegion. ืื ืงืื ืฉื ืืชื ืืืืืง ืกืืคืืช ืขืืืฃ ืืงืจืืืืช ืืืื. ืืกืืื ืื, ืืืขืืงื ืงืื ืืืกืืจืช ื ืืชื ืืืฆืื ืืืืงืื ืขื ื ืืกืืื ืจืืง, ืื ืื ืจืืง ืืืกืืฃ. ืืืงืจืืกืืคื ืื ืืขืืืืช ืฉืืื ืื ืขื ืืื ืื ืฉืื ืื ืืืื ืืืชื ืืืืืช .net.
ืฉืืืช ืืคืกืืง ืคืืขืืช ืืฆืืจื ืฆืคืืื ืืืชืจ. ืื ืืืื ืืงืืืข ืืช ืืฉืจืฉืืจ ืขื ืืจืื ืืจืืื ืืืคืจืขืช ืฉืจืฉืืจ ืจืง ืืืืชื ืจืืขืื ืฉืืื ืืฉืจืฉืืจ ื ืืฆื ืืืฆื ืืืชื ื. ืืื ื ืื ืก ืืืฆื ืื ืืืื ืชืืืื ืืืื ืืืชื ื ื-WitHandle, ืื ืขืืื ืื ืืืืจ ืืชืงืฉืจืืช ื-Thread.Sleep.
ืฉืชื ืืืคืฉืจืืืืช ืฉืชืืืจื ืืขืื ืื ืืจืืขืืช ืืืื ืืืกืจ ืื ืืืื ืฉืืื. ืืคืชืจืื ืืื ืืืฉืชืืฉ ืืืื ื CancellationToken ืืืืชื CancellationTokenSource. ืื ืงืืื ืืื ืืื: ื ืืฆืจ ืืืคืข ืฉื ืืืืืงื CancellationTokenSource ืืจืง ืื ืฉืืืขืืืชื ืืืื ืืขืฆืืจ ืืช ืืคืขืืื ืขื ืืื ืงืจืืื ืืืชืืื ืืืืื. ืจืง ื-CancelationToken ืืืขืืจ ืืคืขืืื ืขืฆืื. ืืขืื CancellationToken ืืื ื ืืืืืื ืืืื ืืช ืืคืขืืื ืืขืฆืื, ืืื ืืืืืื ืจืง ืืืืืง ืื ืืคืขืืื ืืืืื. ืืฉ ืชืืื ื ืืืืืื ืืช ืขืืืจ ืื IsCancelationRequested ืืฉืืื ThrowIfCancelRequested. ืืืืจืื ืืืจืืง ืืจืื TaskCancelledException ืื ืืฉืืื Cancel ื ืงืจืื ืืืืคืข ืฉื CancellationToken ืฉืืืื ืืชืืื. ืืื ืืฉืืื ืฉืื ื ืืืืืฅ ืืืฉืชืืฉ ืื. ืืื ืฉืืคืืจ ืืืืก ืืืคืฉืจืืืืช ืืงืืืืืช ืขื ืืื ืืฉืืช ืฉืืืื ืืืื ืืืืื ื ืงืืื ื ืืชื ืืืื ืคืขืืืช ืืจืืื.
ืืืคืฉืจืืช ืืืืืจืืช ืืืืชืจ ืืขืฆืืจืช ืฉืจืฉืืจ ืืื ืืงืจืื ืืคืื ืงืฆืื ืฉื Win32 API TerminateThread. ืืชื ืืืืช ื-CLR ืืืืจ ืงืจืืื ืืคืื ืงืฆืื ืื ืขืฉืืื ืืืืืช ืืืชื ืฆืคืืื. ื-MSDN ื ืืชื ืขื ืืคืื ืงืฆืื ืืื: "TerminateThread ืืื ืคืื ืงืฆืื ืืกืืื ืช ืฉืืฉ ืืืฉืชืืฉ ืื ืจืง ืืืงืจืื ืืงืืฆืื ืืื ืืืืชืจ. "
ืืืจืช API ืืืืจ ืงืืื ื-Task Based ืืฉืืืช FromAsync
ืื ืืชืืื ืืืื ืืขืืื ืขื ืคืจืืืงื ืฉืืชืืื ืืืืจ ืืฆืืช ืืฉืืืืช ืืืคืกืืง ืืืจืื ืืืื ืฉืงืื ืขืืืจ ืจืื ืืืคืชืืื, ืื ืื ืชืฆืืจื ืืืชืืืื ืขื ืืจืื ืืืฉืงื API ืืฉื ืื, ืื ืฉื ืฆื ืฉืืืฉื ืืื ืืื ืฉื ืืฆืืืช ืฉืื. ืขืื ื ืืขืืจ. ืืืืื ื, ืฆืืืช .NET Framework ืืื ืื ื, ืื ืื ืืืื ืืืืจื ืืืืชื ืืืืื ืืขืฆืื ื. ืื ืื ืื, ื-.NET ืืฉ ืืกืคืจ ืืืื ืืืืจืช ืงืื ืืื ืืื ืฉื ืืชื ืืืืฉืืช ืชืื ืืช ืืกืื ืืจืื ืืืช ืืฉื ืืช ืืื ืืืืฉื. ืืืช ืืื ืืื ืฉืืืช FromAsync ืฉื TaskFactory. ืืืืืื ืฉื ืืงืื ืืืื, ืื ื ืขืืืฃ ืืช ืฉืืืืช ืืืกืื ืืจืื ืืืฉื ืืช ืฉื ืืืืืงื 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
ืืื ืืฉืื ื ืืกืฃ ืฉืืฉ ืืงืืช ืืืฉืืื ืืื ืืืืชื TaskCompletionSource. ืืืืื ืช ืคืื ืงืฆืืืช, ืืืจื ืืขืืงืจืื ืืคืขืืื, ืื ืืืื ืืืืืจ ืงืฆืช ืืช ืฉืืืช RegisterWaitForSingleObject ืฉื ืืืืืงื ThreadPool, ืขืืื ืืชืืชื ืืืขืื. ืืืืฆืขืืช ืืืืงื ืื, ืืชื ืืืื ืืงืืืช ืืื ืืืืช ืืขืืืฃ ืืืฉืงื API ืืกืื ืืจืื ืืื ืืฉื ืื ื-Tasks.
ืืชื ืชืืื ืฉืืืจ ืืืืจืชื ืขื ืฉืืืช FromAsync ืฉื ืืืืืงื TaskFactory ืืืืืขืืช ืืืืจืืช ืืื. ืืื ื ืฆืืจื ืืืืืจ ืืช ืื ืืืืกืืืจืื ืฉื ืืคืืชืื ืฉื ืืืืืื ืืกืื ืืจืื ืืื ื-.net ืฉืืฆืืขื ืืืงืจืืกืืคื ืืืืื 15 ืืฉื ืื ืืืืจืื ืืช: ืืคื ื ื-TAP (TAP), ืืื ื-Asynchronous Programming Pattern (APP), ืืฉืจ ืืื ืขื ืฉืืืืช ืืืชืืืDoSomething ืืืืจ IAsyncResult ืืฉืืืืช ืกืึนืฃDoSomething ืฉืืงืื ืืช ืื ืืขืืืจ ืืืจืฉืช ืืฉื ืื ืืืื ืฉืืืช FromAsync ืืื ืคืฉืื ืืืฉืืืช, ืืื ืขื ืืืื, ืืื ืืืืืคื ื-Event Based Asynchronous Pattern (EAP), ืืฉืจ ืื ืื ืื ืืืจืืข ืืืขืื ืืืฉืจ ืืคืขืืื ืื-ืกืื ืืจืื ืืช ืชืืฉืื.
TaskCompletionSource ืืืฉืื ืขืืืจ ืืืืฉืช ืืฉืืืืช ืืืืฉืงื API ืืืืจ ืงืืื ืฉื ืื ื ืกืืื ืืืื ืืืืจืืข. ืืืืืช ืฉื ืขืืืืชื ืืื ืืืืงืื: ืืืืืืืงื ืืืืืงื ืื ืืฉ ืืืคืืื ืฆืืืืจื ืืกืื Task, ืฉื ืืชื ืืฉืืื ืืืฆืื ืืืืฆืขืืช ืฉืืืืช SetResult, SetException ืืื' ืฉื ืืืืืงื TaskCompletionSource. ืืืงืืืืช ืฉืืื ืืืคืจืืืจ ืืืืชื ื ืืืื ืขื ืืฉืืื ืื, ืืื ืืืืฆืข ืื ืืืืฉื ืขื ืืจืืื ืืืชืื ืืฉืืื ืฉืืืืื ืขื ื-TaskCompletionSource. ืื ืื ืขืืืื ืื ืืจืืจ, ืืืื ื ืกืชืื ืขื ืืืืื ืื ืฉื ืงืื, ืฉืื ืืืืฉืื ืืืฉืง API ืืฉื ืฉื EAP ืขืืืฃ ืืืฉืืื ืืืืฆืขืืช TaskCompletionSource: ืืืฉืจ ืืืืจืืข ืืืคืขื, ืืืฉืืื ืชืืืงื ืืืฆื Completed, ืืืฉืืื ืฉืืืืื ืืช ืืืืคืจืืืจ await ืืืฉืืื ืื ืชืืืฉ ืืช ืืืฆืืขื ืืืืจ ืงืืืช ืืืืืืืงื ืชืืฆืื.
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
ืืืืฉืช ืืืฉืงื API ืืฉื ืื ืืื ื ืื ืื ืฉื ืืชื ืืขืฉืืช ืืืืฆืขืืช TaskCompletionSource. ืฉืืืืฉ ืืืืืงื ืื ืคืืชืืช ืืคืฉืจืืช ืืขื ืืื ืช ืืขืฆื ืืืฉืงื API ืฉืื ืื ืขื ืืฉืืืืช ืฉืืื ื ืชืืคืกืืช ืฉืจืฉืืจืื. ืืืืจื, ืืืืืจ, ืืื ืืฉืื ืืงืจ ืืืกืคืจื ืืืืื (ืืขืืงืจ ืืืืืช ื-RAM). ืืืืื ืื ืืืืื ืืืืืช ืืืฉืืช ืืงืืืช ืขื ืืื ืคืืชืื, ืืืฉื, ืืืฉืื ืืื ืืจื ื ืืขืื ืขื ืืืืืื ืขืกืงื ืืืจืื. ืืืื ื ืฉืงืื ืืช ืืืคืฉืจืืืืช ืฉืื ื ืืืืจ ืขืืืื ืืขืช โโืืืฉืื ืืจืืง ืืื ืืื Long-Polling.
ืืงืืฆืืจ, ืืืืช ืืืจืืง ืืื ืืื: ืืชื ืฆืจืื ืืงืื ืืืืข ืื-API ืขื ืืื ืืืจืืขืื ืฉืืชืจืืฉืื ืืฆื ืฉืื, ืืขืื ื-API, ืืฉืื ืื, ืื ืืืื ืืืืื ืขื ืืืืจืืข, ืืื ืจืง ืืืืืืจ ืืช ืืืฆื. ืืืืื ืืื ืืื ืื ืืืฉืงื ื-API ืฉื ืื ื ืขื ืืื 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, ืืื ืืืคืจืืืจ ืืืืจืช ืชืฉืืื, ืืืืฆืจืื ืืืฉืืื ืืืื ืช ืืฆื, ืืืืื ืืฆืืจืช ืืืืืืงื ืืืฉ, ืฉืืืขื ืชืืื ืืื ื ืืฉืื, ืื ืืืงืจืื ื ืืืจืื ืืื ืขืืืื ืืืฆืืจ ืืขืื. ืืืงืจื ืืื ืขืฉืื ืืืืืช ืฉืืื ืฉื ืงืจืืช ืืขืชืื ืงืจืืืืช ืืืื, ืื ืื ื ืืืืจืื ืขื ืขืฉืจืืช ืืืืืช ืืืคื ืฉืืืืช ืืฉื ืืื. ืื ืฉืืื ืืื ืืชืืื ืืฆืืจื ืืื ืฉืืจืื ืืืงืจืื ืืื ืืืืืจื ืชืืฆืื ืขืืงืคืช ืืช ืื ืฉืืืืช ื-await, ืื .NET ืืกืคืง ืืื ืืืืขื ืืืช - ืืื ื ValueTask. ืืื ืืืืืืจ ืืช ืื, ืืืื ื ืกืชืื ืขื ืืืืื ืืฉืืืืฉ ืื: ืืฉ ืืืืื ืฉืื ืื ื ืืืืืื ืืืื ืืขืชืื ืงืจืืืืช ืืืื. ืืฉ ืื ืืื ืขืจืืื ืืื ืื ืื ื ืคืฉืื ืืืืืจืื ืืืชื; ืื ืื, ืื ืื ืื ื ืืืืืื ืืืืื IO ืืืื ืืื ืืงืื ืืืชื. ืื ื ืจืืฆื ืืขืฉืืช ืืช ืืืืจืื ืืฆืืจื ืืกืื ืืจืื ืืช, ืื ืฉืืืืจ ืฉืื ืืฉืืื ืืชืืจืจืช ืื-ืกืื ืืจืื ืืช. ืืคืืื, ืืืจื ืืืจืืจื ืืืชืืืช ืืฉืืื ืืื ืืืืงืื:
public async Task<string> GetById(int id) {
if (cache.TryGetValue(id, out string val))
return val;
return await RequestById(id);
}
ืืืื ืืจืฆืื ืืืืขื ืืขื, ืืืฉืฉ ืงื ืืื ืฉืจืืืืื ืชืืืฆืจ ืืขืช ืืืืืจ ืืงืื ืืื, ืืชื ืืืื ืืฉืืชื ืืช ืืืืืื ืืื ืืืืคื ืืื:
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. ืืืขื ืื ืืกืืจืืืื ืฉืืืื ืชืฆืืจื ืชืืฆื ืืกืคืจืืื. ืชืืกืคืืช ืืงืืืืืช ืชืืกืคืืช, ืคืืชื ืขื ืืื ืืืงืจืืกืืคื, ืื ืืื ื ืืืง ื-.NET, ืืื ืืกืืคืง ืืืืืืช Nuget. ืืืื ื ืกืชืื ืืงืฆืจื ืขื ืืื ืืื:
- CurrentThreadTaskScheduler - ืืืฆืข ืืฉืืืืช ืืฉืจืฉืืจ ืื ืืืื
- LimitedConcurrencyLevel Task Scheduler - ืืืืื ืืช ืืกืคืจ ืืืฉืืืืช ืืืืืฆืขืืช ืื ืืื ืืช ืขื ืืื ืคืจืืืจ N, ืืืงืืื ืืื ืื
- OrderedTaskScheduler - ืืืืืจ ื- LimitedConcurrencyLevelTaskScheduler(1), ืื ืฉืืืฉืืืืช ืืืืฆืขื ืืจืฆืฃ.
- WorkStealingTaskScheduler - ืืืืฉื
ืื ืืืช ืขืืืื ืืืฉื ืืืืืงืช ืืฉืืืืช. ืืขืืงืจื ืฉื ืืืจ ืืื ThreadPool ื ืคืจื. ืคืืชืจ ืืช ืืืขืื ืฉื-.NET ThreadPool ืืื ืืืืงื ืกืืืืช, ืืืช ืืื ืืืืฉืืืื, ืื ืฉืืืืจ ืฉืขืืืก ืืชืจ ืฉืื ืื ืฉืืืืฉ ืื ื ืืื ืืืืง ืืื ืฉื ืืชืืื ืืช ืขืืื ืืืืืื ืืชืืคืขืืช ืืืืื ืืืืง ืืืจ. ืืชืจื ืืื, ืงืฉื ืืืื ืืืืื ืืช ืืกืืื ืืืืงืืืื ืืืื. ืึถื. ืืืชืื ืฉืืืื ืฆืืจื ืืืฉืชืืฉ ื-WorkStealingTaskSchedulers ื ืคืจืืื ืืืืงืื ืืืชืืื ืืช ืฉืืื ืืฉืืืืฉ ื-ThreadPool ืขืฉืื ืืืืืช ืืืจืกืืื ืืืืชื ืฆืคืื. - QueuedTaskScheduler โ ืืืคืฉืจ ืื ืืืฆืข ืืฉืืืืช ืืคื ืืืื ืชืืจ ืขืืืคืืช
- ThreadPerTaskScheduler - ืืืฆืจ ืฉืจืฉืืจ ื ืคืจื ืขืืืจ ืื ืืฉืืื ืฉืืชืืฆืขืช ืื. ืืืื ืืืืืช ืฉืืืืฉื ืขืืืจ ืืฉืืืืช ืฉืืืงื ืืื ืจื ืืืืคื ืืืชื ืฆืคืื ืืืืฆืืข.
ืืฉ ืืคืืจื ืืื
ืื ืืคืื ืืืืื ื ืื ืฉื ืื ืื ืฉืงืฉืืจ ืืืฉืืืืช, ื-Visual Studio ืืฉ ืืืื ืืฉืืืืช. ืืืืื ืื ืชืืืื ืืจืืืช ืืช ืืืฆื ืื ืืืื ืฉื ืืืฉืืื ืืืงืคืืฅ ืืฉืืจืช ืืงืื ืืืืฆืขืช ืืขืช.
PLinq ืืืืืืงื ืืืงืืืื
ืื ืืกืฃ ื-Tasks ืืืื ืื ืฉื ืืืจ ืขืืืื, ืืฉ ืขืื ืฉื ื ืืืื ืืขื ืืื ืื ื-.NET: PLinq (Linq2Parallel) ืืืืืืงื Parallel. ืืจืืฉืื ืืืืื ืืืฆืืข ืืงืืื ืฉื ืื ืคืขืืืืช Linq ืืืกืคืจ ืฉืจืฉืืจืื. ื ืืชื ืืืืืืจ ืืช ืืกืคืจ ืืฉืจืฉืืจืื ืืืืฆืขืืช ืฉืืืช ืืืจืืื WithDegreeOfParallelism. ืืืจืื ืืฆืขืจ, ืืจืื ื-PLinq ืืืฆื ืืจืืจืช ืืืืื ืืื ืืกืคืืง ืืืืข ืขื ืืคื ืืืืืช ืฉื ืืงืืจ ืื ืชืื ืื ืฉืื ืืื ืืกืคืง ืฉืืคืืจ ืืืืจืืช ืืฉืืขืืชื, ืืฆื ืฉื ื, ืขืืืช ืื ืืกืืื ื ืืืื ืืืื: ืืชื ืจืง ืฆืจืื ืืืชืงืฉืจ ืืฉืืืช AsParallel ืืคื ื ืฉืจืฉืจืช ืฉืืืืช Linq ืืืคืขืืช ืืืื ื ืืืฆืืขืื. ืืชืจื ืืื, ื ืืชื ืืืขืืืจ ืืืืข ื ืืกืฃ ื-PLinq ืขื ืืืคื ืืงืืจ ืื ืชืื ืื ืฉืื ืืืืฆืขืืช ืื ืื ืื ืืืืืฆืืช. ืืชื ืืืื ืืงืจืื ืขืื
ืืืืืงื Parallel static ืืกืคืงืช ืฉืืืืช ืืืืืจืฆืื ืืจื ืืืกืฃ Foreach ืืืงืืื, ืืืฆืืข ืืืืืช For ืืืืฆืืข ืืกืคืจ ื ืฆืืืื ื-Invoke ืืงืืื. ืืืฆืืข ืืฉืจืฉืืจ ืื ืืืื ืืืคืกืง ืขื ืืืฉืืืช ืืืืฉืืืื. ื ืืชื ืืืืืืจ ืืช ืืกืคืจ ืืฉืจืฉืืจืื ืขื ืืื ืืขืืจืช ParallelOptions ืืืจืืืื ื ืืืืจืื. ืืชื ืืืื ืื ืืฆืืื TaskScheduler ื-CancelationToken ืืืืฆืขืืช ืืคืฉืจืืืืช.
ืืืฆืืื
ืืฉืืชืืืชื ืืืชืื ืืืืจ ืื ืขื ืกืื ืืืืจื ืืื"ื ืฉืื ืืืืืืข ืฉืืกืคืชื ืืืืื ืขืืืืชื ืืืืจืื, ืื ืฆืืคืืชื ืฉืืืื ืื ืื ืืจืื ืืื ื. ืืขืช, ืืืฉืจ ืขืืจื ืืืงืกื ืื ืื ื ืืงืืื ืืช ืืืืืจ ืืื ืืชืืืื ืืืืจ ืื ืฉืขืืื 15 ื ืขืื, ืืกืื ืืช ืชืืฆืืืช ืืืื ืืื. ืืจืืงืื ืืืจืื, ืืืฉืงื API, ืืืื ืืืืืืืืื ืืืืืืืืช ืืืกืงืจื ืืืืืจ ืืื.
ืืกืงื ืืช:
- ืืชื ืฆืจืื ืืืืืจ ืืช ืืืืื ืืขืืืื ืขื ืฉืจืฉืืจืื, ืืกืื ืืจืื ืืืงืืืืืืช ืืื ืืืฉืชืืฉ ืืืฉืืืื ืฉื ืืืฉืืื ืืืฉืืื ืืืืจื ืืื.
- ื-.NET ืืฉ ืืืื ืจืืื ืืฉืื ืื ืืืืจืืช ืืื
- ืื ืืืื ืืืคืืขื ืืืช ืืืช, ืื ืฉืืขืชืื ืงืจืืืืช ืืชื ืืืื ืืืฆืื ืืืืจ ืงืืื, ืขื ืืืช, ืืฉ ืืจืืื ืืืืืจ ืืืฉืงื API ืืฉื ืื ืืื ืืืืฅ ืจื.
- ืขืืืื ืขื ืฉืจืฉืืจืื ื-.NET ืืืืฆืืช ืขื ืืื ืืืืืงืืช Thread ื-ThreadPool
- ืืฉืืืืช Thread.Abort, Thread.Interrupt ื-Win32 API TerminateThread ืืกืืื ืืช ืืืื ื ืืืืืฆืืช ืืฉืืืืฉ. ืืืงืื ืืืช, ืขืืืฃ ืืืฉืชืืฉ ืืื ืื ืื CancellationToken
- ืืจืืื ืืื ืืฉืื ืจื ืขืจื ืืืืืฆืข ืฉืื ืืืืื. ืืฉ ืืืืื ืข ืืืฆืืื ืฉืืื ืฉืจืฉืืจืื ืขืกืืงืื ืืืืชื ื ืืืืจืืขืื. ืืฉืืื ืื ื ืื ืืืฉืชืืฉ ืืืืืงื TaskCompletionSource
- ืืื ื-.NET ืืืืงืื ืืืืชืงืืืื ืืืืชืจ ืืขืืืื ืขื ืืงืืืืืืช ืื-ืกืื ืืจืื ืื Tasks.
- ืืืืคืจืืืจืื c# async/await ืืืืฉืืื ืืช ืืจืขืืื ืฉื ืืืชื ื ืื ืืืกืืช
- ืืชื ืืืื ืืฉืืื ืืืคืฆื ืฉื ืืฉืืืืช ืขื ืคื ื ืืฉืืืืืช ืืืืฆืขืืช ืืืืงืืช ืื ืืืจืืช ื-TaskScheduler
- ืืื ื ValueTask ืืืื ืืืืืช ืฉืืืืฉื ืืืืคืืืืืืฆืื ืฉื ื ืชืืืื ืืืื ืืชื ืืขืช ืืืืจืื
- ืืืื ืืช ืืืฉืืืืช ืืืฉืจืฉืืจืื ืฉื Visual Studio ืืกืคืงืื ืืืืข ืฉืืืืฉื ืจื ืืืืชืืจ ืืืืื ืืงืื ืืจืืื-ืฉืจืฉืืจืื ืื ืืกืื ืืจืื ื
- PLinq ืืื ืืื ืืื ืื, ืืื ืืืื ืืื ืื ืืกืคืืง ืืืืข ืขื ืืงืืจ ืื ืชืื ืื ืฉืื, ืืื ื ืืชื ืืชืงื ืืืช ืืืืฆืขืืช ืื ืื ืื ืืืืืงื
- ืืืืฉื ...
ืืงืืจ: www.habr.com