á ááĽá áá áááá ááŁáĽá á áłáľáá ááᣠáľáááá á áľáá
áľ ááľáĽ á°áá á
áá¤áąá áĽáá
áĽá á áá áłáá áĽá ᣠááá áĽá áľáŤáá˝á á áá°áŠáľ á ááŤáł áááá˝ ááŤá¨á á¨áá¨ááá á áľáááááľ áŁáá°ááłá°á áá᳠ᣠáŽáááá°áŽá˝ á¨áááŁáłá¸á á ááľ áá áᢠá¨áááŤá¸á áá, áá
ááááľ á áŁá á°á¨áŁá ááá. á áá ᣠá 2019 ᣠáá
áá á˝áá á áááśá áá áŁá áŁá 8-áŽá á˘áá´á áŽá ááŽá°á°á ᣠá ááľ ááś áá°áśá˝ áŤááá áŠá ᾠᣠáá á¨á áá ááŽá˝ á áľáአáĽá¨á°áŠ ááᢠá á á
áŤá˘áŤáᣠá¨áĽááľ á ááłáľ á ááľ á¨á°ááᣠáľáá˝ á¨áá¨áĽá˝ áľáá á áᣠá áŚááą áá áŁá 8-áŽá ááŽá°á°á á ááᢠá¨á˛áá˛á ááĽáśá˝ á°áŤá˛ááťá¸á 16-áŽá ááŽá°á°áŽá˝á áŁá°á¨áá áľ á áá
á ááľ áá áá áľáááľááá˝ á ááŤá°áááŁá¸á á˝ááá˝ áĽá áŞá˛áŽáá˝ á¨á°áá áá¸áᢠMS Azure 20 áŽáŽá˝ áĽá 128 á´áŁ áŤá áŤáá á¨áášáá áá˝á á á°á áľ á¨2 áśáá áŁáá° áá áŤáááŁáᢠáĽáá° á áááłá°á áá á¨ááá ááľá°ááĽá ááľá°áłá°á áłááťá á¨áá°ááá ááááŁáľ áĽá áá
áá ááá ááááłáľ á¨áááťá ááá˘
áááľ áľááá
áá°áľ - á¨áľááá° ááá áááᣠá¨á°áá á á¨á áľáŤáť áŚáłáŁ ááŽá˝ áááá˘
áá - á¨áľááá° áááá ááá ᣠáľááš á¨á áááá ááá ᣠá¨áá°áą á áŤá ᣠááŽá˝ á áá°áą ááľáĽ áá
á°á¨ áľááľáłá áĽá ááá˝ ááĽáśá˝á áááŤáá˘
áŁááĽá áá°áŤááľ - á¨áľááá° áááá ááĽá¨áľ ᣠáĽá áá°áśá˝á á á°ááłáłá áá á¨ááľááá á˝ááł
áŁááĽá-áŽá - á¨á áááŁáŁáŞá ááĽá¨áľ ᣠááá¨á áá°áľ áĽá áŽááá˝á á¨áá áá á˝ááł
áŁááĽá áá°áľ - á¨áŽááá°á ááĽá¨áľ ᣠá á áŤá á¨áĽá ááŽá°á°á áá á á ááľ áá á¨ááľáŤáľ á˝ááł
áŁá áĽá ááá ἠ- á¨áá°áą ááĽá¨áľ ᣠá¨ááἠáá°áľá á á ááŤáł ááŽá˝ ááŤá¨á á¨áá°áŤá¨áľ á˝ááłá˘
áľááŠááľ - á á ááľ áá ááľáĽ áĽá á°ááŁáŽá˝á á á áŤá á á ááľ áá áá¨ááá
á áá°ááłá°ááᢠ- áá
áá°áľ áĽáľáŞá ááá
áľá¨áľ áłáá áĽá
á¨ááś áĽááá á áááá ᣠá¨á áááá áá¤áą á áá áá áá¨ááá áá˝ááá˘
ááá¤
ááá áľááááá˝ áĽáŠ á áá°áá áĽá á ááłááśáš á°á¨á᪠ááĽáŤáŞáŤ áŤáľáááá¸ááᣠáľááá áááľá áľááááááľ ááá¤áŤá á áá ááááľ áá°á°áááá á¨áááľ á áááá áĽá¨ááŤááᢠá áá ááᤠáááľ ááľá¨á áá°áľ ááá˘
á ááľ áá áááľ á áááááľ ááá˛ááŠáá° áŠá˝á áᥠ(áŽáááá°á). 2 áĽá á ááááááľ). áἠá¤áą á ááŤáł á¨á¤áľ áááá˝ á ááľIO): ááľá, ááááááŞáŤ, toaster, áááááŁ. ááá á áĽáŤá ᣠááĽá áťáá á áአáá á áľááá áĽá áááľ ááľáĽ á ááľáłáá ᣠáĽáľáŞáá áľá¨áľ áłáá áĽá (áłáááłá°áᣠá¨ááá¨ááá-IO-áááĽááááášá á¨áááááŁá ááľáĽ á ááĽáź áá° áłá á ááľáĽ áĽá°áĽáŤáá ᣠá¨á፠á áá á á ááľ áĽá áĽááłáá (áá #1) áĽá ááá°á (áá #2) áłá áá (á¨á°á፠áááááŤ) ááŤá. á áá áááŞáŤáá áĽá¨ááľ áá á ᣠáá á á áĽáá˝ á¨áá (áá á¨ááĽ) á áá áá ááĽá áťá áááá (áá¤áąá á ááľáŹáľ) á¨áá¨ááŠáľá áĽááľáłááᢠáá°áŽáá áŤáአáĽá á áĽáŤá áĽá ááá á˛áá á ááááľ á°ááá¨áľáŠ (áááľ-á ááŚ-ááááá áĽááłá á áá áá áŚáááá á¨áá¨ááŠá áľá áłá á áá ἠáĽá˝áááá˘
áŚááá á 2 áĽááź áĽáť á áĽáľáŹ áá á, áĽá á°á¨á᪠á¨ááá, áá á á°ááłáłá áá, áŚáááá á áááłá áľ áá, á á ááľ áá 3 áľáŤáá˝ á°áŤáá°áá: áŚáááá ááá¨á, áłá áá á ááŤá, áľáľáąá ááá . á˛áአá¨áŽáááŠá°á ááŁá á áŤá áá áŁá áጠáĽá áá áááá ááá áŤááá¨áá áŁáľááá áĽá áá áá¤áłá áááľá áá¨á á¨á áጠáĽá¨á°á¨á° áĽáŤá á˛ááŠá á á ááľ ááá ááŤá ááá˘
ááá¤áá á ááá ááĄ-
- áŚááá á ááĽá°á áá°áľ ááľáĽ á¨áá ááĽáśá˝á ááááἠáĽáááŤáá, áá á¨áĽá áľáŤáá˝ ááłá áááá. á áá ááĽáĽáĄ áŽáááá°áŽá˝ á áá á¨ááľ á¨á°áá˝ á áŁá á¨á°áťá áá¸áá˘
- áĽáá° áŹáľáśáŤááľ áŤá áĽá áźáá˝ áŤááľ áŠá˝á áŁá áĽá áŽá áŽáááá°á ááá˘
- á áá ፠ááá¨á ááľáĽ áŁáá á¨ááἠáááľ á¤áľ ááľáĽ áĽá ááἠá¤áśá˝ - á¨ááἠááá¨á
NET ááłáŞáŤáá˝
á áá ááľáĽáŁ áá áĽáá°ááá˝ áĽá áááŽá˝áŁ .NET áĽáŠ ááᢠá áĽáŤááłááą á á˛áľ áľáŞáľ á¨áĽááą áá á áĽáŽ áááľáŤáľ á°á¨á᪠áĽá á°á¨á᪠á áłá˛áľ ááłáŞáŤáá˝á áŤáľá°ááááᣠá áľááá° ááá ááŽá˝ áá á á˛áľ á¨á áĽáľáľáŤááľ ááĽááĽáŽá˝á˘ á¨áááŁáł áá áááŤáá˝ áá á áá°áŠá áľ áá á¨ááá ááá˘áá˝ á ááľ ááá á¨á፠á áá á°á¨ááá˝á áá° áłá˝ áááá¨áľ áĽáľáá á¨áá°á á áŤááľ áá áááᢠáĽááá áá áá á áľááá á áá°áá, á á°á¨ááŞá, áĽáŤáľáá á áĽááľ áĽáŤáľá ááááłáľ áĽáľá áá¨ááłá, ááá áá á ááłááľ áá, á áá á áá, á˝ááŠá ááááłáľ áĽá¸áá ááááľ ááá áá˝áá. á áá áŤáá á¨á áĽáľáľáŤáá˝á á°á¨á.
á ááłáŞáŤáá˝ ááá´ áááąáá á¨ááŽááŤááá á áááá˝ (á¤áá áá¤áľ) á áááá áĽá á áśáľá°á ááá ááŹáá˝ á¨á°á°áĄ áĽáá˛áá áá á¨áśááľáá áááľá á¨áĽá-áá áŽáľ áá á¨á°áŤáŤá á˝ááŽá˝á á ááá áááááľ áŤáľá˝ááá˘
áá áááá
ᨠThread ááá á NET ááľáĽ á áŁá áá á¨áłáá á¨áá ááá ááᢠááá˘á á¨áááľ á°ááŤáŽá˝ á ááąá ááá áááĄ-
- ThreadStart - ááá áááŞáŤáá˝ á¨áá
- ParametrizedThreadStart - á¨á ááľ áá¤áľ á áááľ ááá ááá˘
á°ááŤáŠ á¨ááá áá´á á¨á ፠á áá á á˛áľ á á°áá á¨á áá ááľáĽ ááá¸áááŁá¨ááŤááľáŤáááľ áľáŹáľáľáłááľ á áááľ áááŤá ááááŁáłá á¨á°ááá á ááľ ááá áá° ááá áá´ áá°ááá á áá áľá˘ áá áá´ áááááá á¨á áŤáŁá˘ áá¨á áá° áĽá¨áą áááľá°ááá áŤáľááááᢠáá ááá á á áŁá ááľ áľáŤ áĽáá°áá áĽá áአáŤáą á¨áŁáľ ááá áĽáá°áá áἠááŁá á¨áááŁá á˘áŤááľ á á ááľ ááá 1 áᣠáá á°á¨ áľááľáłá áľááááľáĽ áĽá á¨áľááá° áááá á¤áá á áá ááľá°ááĽá áľáááŤáľáááá ááá˘
new Thread(...).Start(...);
ᨠThreadPool ááá á¨ááá á˝áá°-ááłáĽá áááááᢠá NET ááľáĽ ᣠá¨áá áááłá á¨áá ááľáľá ááŤá áá áĽá á ááááŽáśááľ ááľáĽ áŤá ááá˘áá˝ á áĽá áááłáá˝ ááľáĽ á áĽáŠ áááł áĽáá˛á ፠áááľá¨á áĽá áĽá¨áľ á áľááááá˘
á á ááá á˝áá°-ááłáĽ
á¨á°ááá¨á áľ áá ááᎠá áááŹá˝á á áá áŁá á፠ááľáĽ á ááŤáł ááŽá˝ á¨á áľá°ááᣠáááĽáŤá áĽá áĽááąá ááá áá áĽáľáá áá°áŁáᢠááŽá˝ á á°á°ááá áĽá á áĽááľ áĽá á áá á¨áá, áááłá á¨áĽáŞ áŽáľ ááááśá˝á áááááľ áá°áá. á áááłá ááľáĽ á áľááááá áá áá ááŽá˝ á¨áá ᣠá¨áአááľáĽ á ááąá áĽáľáŞáááľ áľá¨áľ áá áĽáá ááá á á˛áľ áááĽáŤáᢠá¨áá á áááłáľ á¨áá áááłá áá ááłááľ á áŤáá áľáááśá˝ á áŁá áĽáŠ áĽá á áá°áá áŞáŤáá˝ á áááľ ááľáĽ áĽáá° á áááááľ ááá°áŠ áľáŤáá˝ á áŁá á°áľáá áá.
á¨ááá áááłá áá áá ááá áá á¨WaitCallback á áááľ á°ááŤá á¨áááľáľ á¨QueueUserWorkItem áá´ á áᣠáĽáąá á¨ááŤááľáŤáááľ áľáŞáľáľáłááľ ááá áá á¨ááááľ áĽá áá° áĽáą á¨á°áááá áá¤áľ á°ááłáłá á°ááŁá áŤá¨ááááá˘
ThreadPool.QueueUserWorkItem(...);
áĽáá áŤááłáá á¨áá áááł áá´áŁ RegisterWaitForSingleObjectᣠá¨ááá¨áááá IO áľáŤáá˝á ááá°áŤááľ áľáŤ áá ááááᢠáá°áá áá´ á¨á°áááá áááŤá áá° áá´á áŤááá WaitHandle á˛ááá áá áŤáá˘
ThreadPool.RegisterWaitForSingleObject(...)
NET áá á¨á°ááľ ááŁáŞ á áá áĽá á¨ááááááľ/WPF áá ááŁáŞáá˝ á¨ááá¨á á°ááŁáŁáŞá á¨áááłá á á°áá°á° áá áá áá áŤáá˘
System.Threading.Timer
áááľáŤ áááŤáá á¨áááłá áá° áá áááá á áŁá áአá¨áá ááááľ á á - ᨠBeginInvoke áá´á˘
DelegateInstance.BeginInvoke
áĽáá˛áá á¨áá á¨á°á ááąáľá á áĽáááášá áá´áá˝ á áá áŤá á°ááŁá áá á á áአáá°áŽá áĽááááá - CreateThread from Kernel32.dll Win32 API. áá áá á°ááŁá áááĽáŤáľ áááŤá áá´áá˝ áá´ ááľáá áááŁáá á ááľ ááááľ á á. áĽáá˛á ááááąá áĽáŞ á ááľ áá áĽáť á áŁá á áľá᪠á ááá á¨á ááľ áŽáľ ááłá ááľáĽ á ááťááᣠáĽá áŤáá áŤá°á¨áá á°áŤá˛á á°ááłá˝ááľ á ááá ááĽá áĽááá áá˝ ááá˘
Kernel32.dll CreateThread
ááŽá˝ áááá¨áľ áĽá áá¨á
á áŤáľá á¨á°áá አááŽá˝áŁ ááá á¨áśáľá°á ááá á áŤááľ áĽá ᨠ.NET áááł á Visual Studio Threads ááľáŽáľ ááľáĽ ááłáŠ áá˝ááᢠáá ááľáŽáľ áľá ááŽá˝ áá¨á á¨ááŤáłá¨á á áááŹá˝á á áá¨á áá á˛áá áĽá á áĽá¨ááľ áááł áá á˛áá áĽáť ááᢠáĽáá á¨áĽáŤááłááąá áá á¨ááá áľáá˝á áĽá á áľá፠á¨áá°áŁá¸áá áááŽá˝ á á ááş áááł áá¨áľ áá˝ááᣠáá¨á áá° á ááľ á¨á°áá°á áá ááááŠá˘ á áá ááá á¨á áľá፠ááĽá¨áľáŁ á¨ááá á áľá፠áááááľ áľá˝ááá˝áᣠáá á áŚá˛ áĽá CLR á áá ááŤá¨á á¨á áááŁáŁáŞ áá á˛áŤáá áĽáá° ááá áááľáłáá˘
á°ááŁá áľáአá¤á° ááťáááľ
á¨á°ááŁá áľáአá¤á° ááá ááľ (TPL) á NET 4.0 ááľáĽ ááá§áᢠá áá á¨á á˛ááŽá áá áááľáŤáľ áá°á á áĽá ááá ááłáŞáŤ áá. á¨áአá ááŤá¨áŚá˝á á¨áá áá ááááá áŽáľ áĽáá° áááľ ááá áŤáᢠá¨TPL áá°á¨áłá á ááľ á¨á˛áľá°á.Threading.Tasks á¨áľá áŚáł á¨á°ááŁá ááá ááᢠá°ááŁá á áá áá áŤá á¨áá ááᢠá á á˛áą á¨C# áááᣠá¨á°ááŁáŽá˝ áá áááľáŤáľ á¨ááŤáá ááááľ á ááá°áá - ááááŤáá˝á áááłá°á/áá áŁá á ᢠáĽááá á áá°-ááłáŚá˝ áŤáá°ááłá°á áŽáľá ááá áĽá á¨á°ááłá°á áŤá á áĽáá˛á˝á á áľá˝áá¸ááᣠáá á áľá ááŽá˝ ááľáŁá á á áŤá áĽáá áááᤠáááá¸á á°áá˝ áĽááłá á¨á á áľáŤáá˝á á áá°áŠá áľ áá á¨ááááá á áá°áá áŞáŤáá˝á á¨áá áá áá°áá áŞáŤáá˝á áĽáá˛á˝á á áľá˝áá¸ááᢠasync/wait áá áá á¨á ááľ ááá á¨á áᥠá˝ááá˝ áááľ áááŁááá áá ááĽáĄá á áĽááľ áá¨áá° áááŽá˝ ááá¨áłáľ áĽáááŤááá˘
- async á°ááŁáá ááá áŁáśááľá á¨ááááľ áá´ ááá¨áŞáŤ ááá˘
- áĽá á¨áá á áá á¨á°ááŁá á¨ááŤááľ á¨áĽá á áŚááŹá°á ááá˘
á ááá: á°á áŁáŁáá áŚááŹá°á, á á á ááá áááł (ááŠááśá˝ á á), á¨á ááá á¨á áááá áá á¨á áá áááá, áĽá á°ááŁáŠ á ááááá á˛áŤá áá á , áĽá áá (á áĽáááĽ, á ááľ áááአá¨á áá áľááá áá, ááá áá). á¨á፠á áá) áá´áá á¨á áá áá°áá áŠá áááá á áá ááááᢠá NET ááľáĽ ᣠáá áá´ áĽáá° áááľ ááááť á á°ááłáłá ááááľ áá°áá áŤá ᣠá¨á˝áá áá´ áá° á á ááá ááá á˛áá¨á ᣠá¨áááľ áá˝á áĽá á áĽááá áááśá˝ áá á ááááŽá á á°ááĽá áá°áá á áá˝ááᢠááááľ áŤáá ááááá á°á async / á áá áŁá á ᣠá áá ááá áĽá áľáĽá°áŁáá JetBrains dotPeek á Compiler Generated Code á¨áá á áá áá áááááá ááá áŽáľ ááá áá˝ááá˘
á°ááŁáá ááááá áĽá ááá áá á ááŤáŽá˝á áŤáľáĄá˘ á¨áá á áłá˝ áŁáá ááłá áŽáľ ááá á¨ááá á á á á˛áľ á°ááŁá áĽáááĽáŤáá (áá. áĽáá áá (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 áľáŤá á ááĽááľ áĽáá°ááá ááá ááá áá, áá áááľ ááááŁáľ á¨áááłá áá áá ááááá°áľ áá°áĽ á ááĽááľ, ááá áá ááŞáá áááááłáľ ááá á°ááŁá á¨á°áᨠááá á á ááĽááľ.
- á°áŤááá áá° ááá - á°ááŁáŤáľ á á°áá¨áľ ááľáĽ áá°áá áá˝ááᢠáá á ááŤá áĽá á áá á¨áá á¨áá, á°ááŁáŠ áĽáŤáą áŁá áááá áľ áĽá áááš áĽáľáŞáŤá áá á áľá¨áľ á áá áŁá á áá ááá áá˝áá.
- PreferFairness - áááľ á áá áá á¨á°ááŠáľ á ááľ áá áááá á¨á°áአá°ááŁáŤáľá áá¨ááá áĽáŠ áááá áááľ ááᢠáá áá ááá áĽáť áá áá¤áąá ááľáľá á¨ááá.
áá° áá´á á¨á°áááá ááá°áá áá¤áľ CancelationToken ááᢠáááá á¨ááᨠá áá áá°á¨áá á áľááá áááľá°áááľáŁ áĽá¨á°á°áŤ áŤáá áŽáľ á CancelationToken áááł áá áŁá áá°áťáá˝ ááááľ á áá áľá˘ ááá áźáŽá˝ á¨áá á CancelationTokenSource ááá áá á¨á°á áŤá á¨áľá¨á áá´ á°ááŁáŠ á¨áááአá ááľ áĽáť áá ááľáá á¨áá˝ááá˘
á¨áá¨á¨áťá áááŞáŤ á¨á°ááŁá áááááĽá á áááľ áááááĽá á á᪠ááá ááᢠáá ááá áĽá ááŽáš á¨á°áá°ááľ á°ááŁáŤáľá á ááŽá˝ ááľáĽ ááá¨ááá áľááśá˝á ááááŁá á ááᣠá ááŁáŞááľ á°ááŁá á¨áááłá á áááá° áá áá áá¨ááááá˘
á°á áŁáŁáá áŚááŹá°á á á°áá á¨á á°ááŁá áá áá°áá áŤá ᣠáá áááľ á¨áą á áá á¨á°ááá áŽáľ áŤá ᣠá¨á°á áŁáŁáá á ááľ áŤáá áŽáľ áá á á°ááłáłá á ááľ (áĽááá áá áá áááľ á á°ááłáłá áá áá) áá¨áááá áááľ áá á˘
áá´á áĽáá° assync void ááááľ á°á°ááá áłáᣠáá áááľ á°á áŁáŁááá áŚááŹá°á áĽáá˛á áá ááááľááłáᣠááá áá á¨áĽáŞ ááĽáŠ áĽáľáŞáá¸á áľá¨áľ áá á á á áá˝ááᢠáá á˝ááł á¨ááŤáľááá á¨áá, áá´á á ááľ á°ááŁá ááááľ á áá áľ. áŤáá°ááłáłá áŁáśááľ ááááľ á¨á°á°á¨ááŁá¸á áá´áá˝ á áŁá á¨á°áááą áá¸á: áĽáá° á ááľ á°ááĽ, áĽááá á¨ááľá°áľ á°ááŁáŁáŞáá˝ ááá ááá˝ á áĽáłáľ ááá áá á¨áá°áŠ áĽá á¨áááłáľ áá´áá˝ áá¸á. ááľáŤá áĽáľáŞá ááá áľá¨áľ ááá á á áĽáľáá ááľá áľ áĽáť áłááá áá¤áąá áááááľ á áľááá á¨áá á°ááŁáá áá áá á áľááá áá.
á¨StartNew áá´ á á°ááá°á á°ááŁá áá áŁááá áá áŁáĽáá°ááááá ᣠᨠConfigureAwait áá´á á áá¸áľ áá¤áľ ááĽáŤáľ áá˝áá áŁá¨ááŤá á¨á°á áŁá á á áá á áááá á¨áááĽááľ á á°áŤáá á ááľ áá áłááá á áááá° ááᢠáá á¨á°á áŁáŁáá á áá á¨á áááá á ááľ ááŽáą á áľááá á ááááá áľ áá áá áá°á¨á á áá áľ. áĽáá˛áá á á¤á°-áá˝áááľ ááľáĽ á°á á áá á¨áá°áá°á áŽáľ á˛á˝á á¨á¤áá¤áľ á¨á°á°á ááá ááá˘
á°ááŁáŤáą áĽáľáŞá ááá áľá¨áľ áĽáá´áľ áá á á áĽáá°áá˝á áá áľáá˝ áĽáááᢠá¨áá á áłá˝ á¨áŽáľ ááłá á áᣠáĽá áá á áááłá áááł áĽáŠ á˛áá áĽá áááłá á áá áá ááĽá á áááá áľ áá áá á áľá°áŤá¨áśá˝ áŤááľá˘
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
}
á ááááŞáŤá ááłá, á¨áá°ááŤáá áá áłáááľáĽ áľáŤá áĽáľáŞá ááá áľá¨áľ áĽáá áĽááá, áá¤áąá áá° áááá á á¨ááááá°á ááľááá á áááá áľ áá áĽáť áá, áĽáľá¨á፠áľá¨áľ á¨áá°ááŤá áá á áŤáą áááŤá.
á ááá°áá á ááŤá áá´á áá¤áą áĽáľáŞá°á áľá¨áľ á¨áá°ááŤáá áá áĽááááá. áá ááĽá áá ááááŤáąá áĽá ááľá, áĽáá˛á áŤá á áá ááŽááŤá ááĽáľ, ááá áľáŤ ááľááľ áá, ááá áá á°áá á¨ááá áŤá áá´ áŽáľ ááľáĽ áá á á áŤá áĽáť á áá°áá, áĽá á¨áááłá°á á ááľ áá° áĽáŞ áá ááááľá áŤáŤáľáłá. á¨á°á áŁá á á áá áĽá áĽááááá-á¨áĽáŞá áá áŤáá°ááłá°ááá áá´ áááááá áá¤áąá áĽá¨á á á áá ᣠáŤáá°ááłá°áá áá´ á áĽáŞá áá ááľáĽ ááá¸áá áááá á á á¨ááą ááááŤáá˘
á¨áá á á°áŤá ááá ááłáľ ááľáĽáľáĽ á¨áľá á°áľ á áŤáŤá áá. áĽáááłá áá asynchronous code ááľáĽ áŤá áľá á°áśá˝ async / wait á á˛á áá áááľá°áááľ á áŁá ááá áá¸á - áŽáą á¨á°ááłá°á á¨áá á°ááłáłá áŁá ᪠á áá¸áᢠá¨á°ááłá°á áá á á ááľááŁáľá áá°ááŁá á¨á°á áááá áľáŁá¨ááááŞáŤá ááŠááľ á AggregateException á°á á ááá ááŁáááľáᢠááŠááąá áááľá°áááľ á C # á áá ááľáĽ á¨á áá á¨ááłááá á¨áŤá áĽáá á°áá°ááľ ááá ᨠInnerException á áááľá áá°áľ áĽá á°áá°ááąá áĽáŤáľá á á ááľ ááŤáŁ áĽáá ááľáĽ ááá ááá á˛ááᥠááŤáŁáá áá ááá˘
áŚáľá°áá áĽá á¨áá¨á¨áťááš ááłááá˝ á á°ááłáłá ááááŤáľ ááĽá á°áĽáá ááááľ á¨á°á°á¨ááŁá¸á áĽá áááá á°ááłáłá á˝ááŽá˝ ááááá˘
ááźá áĽá ááá áá´áá˝ á¨á°ááŁá áĄáľáá á˛á áĽá áĽá á á áŁá ááš á˛áá á¨á°ááŁá áĄáľáá áá° á ááľ áŤá áááá á¨áĄáľá ááľáĽ á ááááŞáŤá á°ááŁá áá ááá ááá á°á á ááááá¸áá á˛áŤá áá áá˘
á¨ááá፠ááŽá˝
á á°ááŤáŠ ááááŤáśá˝ áá á¨ááᨠá áá ááá á áľááá ááá áá˝áá. áá áá áááľá¨á á ááŤáł ááááśá˝ á á. ᨠThread ááá á°áᢠáľáá˝ áŤáá¸á áááľ áá´áá˝ á ááľ - áĽááá áá¸á á áľááᰠи á áá¨á . á¨ááááŞáŤá áá á ááá á áŁá á¨á°á¨áá¨á áá, ááááŤáąá. á¨áĽáŞá á áá á ááááá á¨áááá° á á˝á ᾠᣠá ááááá áááŞáŤ áá°áľ áá ᾠᣠáአáááł ááŁáá ThreadAbortedException. á¨á˘áá˛áá á°áááá á˛á¨áá áĽáá°áá áŤá áአáááł ááŁáá áĽáá á áá áĽáá ᣠá áá°á? áĽá áá á áá´ á˛á áá, áá á áŁá á°á¨áŁá áááł áá. CLR áĽáá°áá áŤá áአáááłá á á°áá°á á¨áŽáľ ááá ááľáĽ áĽááłááĽá áá¨áá¨á á¨ááá á áĽáŞáá˝ áá á áá áá˝áá áá.áá᪠ááŞá˛áŤá ááá, Thread.EndCriticalááá. á áá¨á¨áťá áĽááł ááľáĽ á¨á°áťá ááááá áŽáľ áá° áĽáá°áá ááááľ áĽáŞáá˝ ááá¨áŤáᢠá áá ááááŤáľ ᣠá áááá áŽáľ á áááľ ááľáĽ ᣠáŁáś áá¨áŤá á áá áá áĽááŽá˝á ááááľ áá˝áá ᣠáá á áá¨á¨áť áŁáś á áá°ááᢠááááŽáśááľ áá áá áá´ á áŁá á°áľá áľáááŤá°ááá á .net core ááľáĽ á ááŤá°áąá.
á¨ááá¨áĄ áá´ á¨á áá áá°áá á áá°áŤáᢠá á°áᨠáááł áááá ááŤááἠáá˝áá ThreadInterruptedException áአá áá áŁá á áááł ááľáĽ á áááá áľ áá áĽáť. áá°áá áááł á¨áááŁá WaitHandleá á áá áŁá á áá áĽáŤá á ááá áá áᣠá áááá ááá Thread.Sleep á¨á ፠á áá ááá˘
á¨áá á¨á°ááášáľ áááąá á ááŤáŽá˝ ááá°áá á á áááťáá¸á ááĽá áá¸áᢠáááŤá á ááááŠá áá áá áá á¨áľá¨á ááľáá°áŤ áĽá ááá áľá¨áTokenSource. ááá ááá áá ááᥠá¨CancelationTokenSource ááá á ááľ ááłá á°ááĽáŻá áĽá á¨áĽáą áŁáá¤áľ á¨ááá áĽáť áá´áá á áá°áá ááś áĽáááá ááá áá˝áá. á°áá. áá° ááś áĽááá á¨áá°áááá á¨CancelationToken áĽáť ááᢠá¨CancelationToken áŁáá¤áśá˝ ááś áĽáááá áŤáłá¸á áá°á¨á á áá˝ááᣠááá áá áááá áá°á¨áá áĽáť áá¨ááἠáá˝ááᢠááá á¨áŚááŤá ááĽá¨áľ á áᢠáĽáá˛á°á¨á á°á ááá áĽá áá´ á¨á°á°á¨á ááŁá. á¨áááá á¨á°áᨠááá ááĽáá á°ááŁá á°á°ááá áአá¨áľá¨á áľááą á¨á°á áŤá á CancelationTokenSource ááłá áá á¨áľá¨á áśá¨áá áŤá áá¨á¨ á¨ááᢠáĽá áĽá á¨áááá¨á áá´ áá ááᢠáá¨áľ áŤá ááś áĽáá ááá¨áĽ á áá˝áá áľ áá áá ááĽáĽáá á ááľá áľ áá áŤáááľ á ááŤáŽá˝ á¨á°áťá ááá˘
ááá áááá á áŁá á á¨ááá ááááľ Win32 API TerminateThread á°ááŁáá áá°áá ááᢠáá áá á°ááŁá á¨á ፠á áá ᨠCLR áŁá ᪠áŤáá°á á á ááá áá˝ááᢠá á¤áá¤áľá˛á¤á áá áľááá á°ááŁá á¨áá¨á°áá á°á˝áááĄ- "TerminateThread á áŁá á¨áŁáľ á áá ááłáŽá˝ áá áĽáť áĽá á áá ááá áŤáá áľ á á°áá á°ááŁá ááᢠâ
á¨Async áá´á á áá áá á¨áᨠá¤áá áá áá° á°ááŁá á ááá¨á áá
á°ááŁáŤáľ á¨áᥠá áá á á°ááá¨á ááŽáááľ áá áááľáŤáľ áĽáľáá á¨ááá áĽá á¨á áĽááášá ááá˘áá˝ á¸áĽ áŤá áľááľ áŤááá°ááľá áĽá á¨áአá¤áá ááá˝á áááľá áááąáá á¨áśáľá°á ááá ááľá°áááľ á ááááĽá áᢠáĽá áĄáľáá á¨áá á ááľ áŤá°ááŤá¸áᢠáĽáá° áĽáľá ááᣠáᥠáĽáŤáłá˝áá ááá¨áŁá¨áĽ ááá á˘á˝áá á¨.NET Framework áááľ áĄáľá áĽáá ááá¨áŁá¨áŁáᢠáŤá áá áá ᣠNET á á áŽáá áŤáá°ááłá°á ááŽááŤááá á ááŤá¨áŚá˝ áá° á á˛áą á¨á°áááá áŽáľ áŤáááá á áá áááá¨á á ááŤáł ááłáŞáŤáá˝ á ááľá˘ á¨ááŤá¨áá¸á á ááą á¨FromAsync á¨á°ááŁá ááĽáŞáŤ áá´ ááᢠá¨áá á áłá˝ áŁáá á¨áŽáľ ááłáᣠá¨áἠáá á¨á፠áááá á¨áľáŽáá áŤáá°ááłá°á áá´áá˝ áá áá áá´ á°á á á á á°ááŁá áĽá áááááá˘
object state = null;
WebRequest wr = WebRequest.CreateHttp("http://github.com");
await Task.Factory.FromAsync(
wr.BeginGetResponse,
we.EndGetResponse
);
áá á ááľ ááłá áĽáť áá áĽá áá á á áĽáŽ á á°á°áŤá á áááľ ááľá¨á á áá á á áĽááľá ááá áá ááááá á¨áᨠááŽáááľ á ááá á BeginDoSomething áá´áá˝ áĽá¨á°á¨ááá áá IAsyncResult áĽá EndDoSomething áá´áá˝á á˛áá áá˘
á¨á°ááŁá áá ááá፠ááá áááá á áá áá á¨áᨠá¤áá áá áá° á°ááŁá á ááá¨á áá
ááłá°áĽá áľ á¨áááŁá ááá á áľááá ááłáŞáŤ ááá áá á¨á°ááŁá áá ááá፠ááá. á¨á°ááŁáŽá˝áŁ á áá áĽá á¨á á°áŤá ááá á áááᣠá¨áá á¨áááŠáľá ᨠThreadPool ááá RegisterWaitForSingleObject áá´á á áá á áááľá áá˝ááᢠáá áá ááá á áá áá á¨áľáŽ áŤáá°ááłá°á á¤áá ááá˝á á á°ááŁáŽá˝ ááľáĽ á ááá áĽá á á°áá˝ áááł áá á áá áá˝ááá˘
ááá ááá áľá TaskFactory ááá ááŽáá á˛áá áá´ á áľááľá á°áááŹáŤáá áľááá ᢠáĽáá áá ááááŽáśááľ ááááľ 15 áááłáľ á˛áŤááἠá¨áá á¨á áŤáá°ááłá°á áá´áá˝á á ááľááá ááľáĽ áŤááá á á ááá áłáŞá ááľáłááľ á ááĽáᥠá¨á°ááŁá áá á¨á°áá°á¨á° áŤáá°ááłá°á ááľá (TAP) á¨ááľá¨áą á ááľ áŤáá°ááłá°á á¨ááŽááŤááá áĽááľ (APP) áá áᢠáľá áá´áá˝ áá á ááá¨á¨ááááľ ááá áŤáľáá á¨IAsync áá¤áľ áĽá áá´áá˝ áá¨á¨áťDoSomething á áľá°ááá áĽá ááĽááá áááłáľ áááľáŁ á¨FromAsync áá´ á áŁá áĽáŠ ááᣠááá áá á áá áá°áľáŁ á Event Based Asynchronous Pattern á°á°áŤ (á˘.á.á á.) áŤáá°ááłá°áá áááá á˛á ááá á ááľ ááľá°áľ áááłá áĽá áááś áá áá˘
TaskCompletionSource á ááľá°áą áá´á ááŞáŤ á¨á°ááᥠá°ááŁáá áĽá á¨áአá¤áá ááá˝á ááá á áá áášá ááᢠá¨áĽáŤá áá ááá áĽáá°áá¨á°áá áá-á¨áá ááá á ááľ ááá á¨á°ááŁá á áááľ á¨á áἠááĽá¨áľ á áá, áááłá ââá SetResult, SetException, ááá° á TaskCompletionSource ááá áá´áá˝ ááĽáĽá áá°á¨áá áľ áá˝áá. á°á áŁáŁáá áŚááŹá°á á áá á°ááŁá áá á á°á°áá á¨áŁá¸á áŚáłáá˝áŁ áá°ááŁá áá ááá፠ááá á á°á°áá á¨á áá´ áá á áááľá¨áľ á á°áᨠáááł ááá¸áá ááá áááľááᢠá ááá ááá˝ áŤáááᣠá ááłááľ á¨áľáŽ á˘á¤á-á¤áá á 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 ááľá¨á á¨áá˝ááľ á¨áľáŽ á¤áá ááá˝á áá á áá áĽáť á áá°ááᢠáá áá ááá áá áá ááŽá˝ á áááŤá á°ááŁáŤáľ áá á¨á°ááŤáŠ á¤áá ááá˝á á¨ááá°á á áľá°áłá˝ áĽáľá áá¨ááłáᢠáĽá áá°áą, áĽáá°áááľáłáá°á, ááľ ááĽáľ áá áĽá ááĽáŤá¸á á¨á°áá°á áá (á á°ááá á RAM áá á). áá áá°áĽ á˛áá á áááááľ ááá ááᣠáááłá á¨á°áŤá á¨áľá áá°áá áŞáŤá ááľáĽáľáĽ á¨áááľ á ááááŽá˘ áĽáá° ááá-áá፠áŁá áá´áá˝ áľáá ፠áá á¨áááá¨áá á ááŤáŽá˝ áĽááľáĽá˘
á á áአᣠá¨ááłááŤá áá ááá áá áá-á áĽáą á áŠá áľáá°á¨á°áą á ááłááľ ááľá°áśá˝ á¨á¤áá á áá¨á ááá á áŤáľáááááłá ᣠá¤áá á á áá ááááŤáľ ááľá°áąá áŞáááľ ááľá¨á á áá˝áá ᣠáá áááąá áĽáť ááááľ áá˝ááᢠá¨áá ááłá á¨ááĽáśáŹáľ áá á ááľ ááá á áá ááááŤáľ áá áá á´áááá ááá áá á áááťáá áľ áá á á¤á˝á˛á˛á áá á¨á°ááᥠááá á¤áá ááá˝ áá¸áᢠá°áá áá á¨á¤á˝á˛á˛á á áááá áá á¨á áá˝ááᢠá¨á¤á˝á˛á˛á á áááá á¨á°áá á áá áááááľá á áŤáą áááá á áá˝ááᢠááá áááľá á ááááŠá á á°ááľ ááŁáŞ áá áľáá˝ ááľá áľ áá ᣠáá áá á á áááአáá á°á¨á᪠áááľ áĽá á á ááŤá TimerInterval / 2. áá áá áááá ááá áááá á¨á°áŁá áĽáááľ á°áá ᨠᣠáá á á¨á áááአááá˝ áááá¨áľá áŤáŤáľáłá ᢠááá áĽáľáŞáŤáá áľá¨áľ ááá á ááľ ááľá°áľ áĽáľáŞá¨á°áľ áľá¨áľá˘ ááľá°áą á°á¨áľáˇá á¨áá, á¨ááŤá áĽá¨á°á°áŤ áá, áŤááá, á¨ááŤá áĽáŤá áĽáá°áá áááŤá.
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á áľááá áá áá°áĽ áľá˝ááá á˘
á¨áááĽááľ áĽáŤá á˛á°ááľá á áááá -áááą ááľáĽ á¨á°ááŁá áá ááá፠áááá áĽáááĽáŤáá áĽá áĽááľááá ááá áĽá á¨á፠ááááŞáŤ áá áĽáá°ááá á áĽáá áĽááá-á¨á°á áá°á á¨áá ááá°áľ áŤá áá ááá áááĽááľ á°ááˇáá˘
ValueTaskᥠááá áĽá áĽáá´áľ
áŤáá°ááłá°áá/á¨áá áŁá á ááááŤáá˝áŁ áá áĽáá° áááľ ááááť ááááŤáŁ á¨áľááą á¨áľá´áľ áá˝á áŤáááŤáᣠáĽá áá á á˛áľ ááá ááá á ááᣠááááá á áľááá á áá°ááᣠááá áá á áá á áá á˝áá áááĽá áá˝ááᢠáá ááłá á áŁá áĽá áá á°áĽá á¨áá ፠áá´ ááá áá˝áá, áĽá¨á°ááááá áŤááá á á´áŽááľ á á áľá áĽá á ááś áşáá˝ á¨ááá አáĽáŞáá˝ áá. áĽáá˛á ááááą áá´ á¨á°áťáá á á áĽááááš áááłáá˝ áááá á¨áá áŁá á áá´áá˝á á ááá áá¤áąá ááááłá ᣠá¨á፠NET áá áá ááááťá¸áľ ááłáŞáŤ áá°áŁá - á¨áŤááŠáłáľá ááá áᢠááá˝ áááľá¨á, á¨á á ááá ááłáá á°ááá¨áľ: áĽá áá á¨ááááľá áľ áá¸á፠á á. á ááľáĄ á ááłááľ áĽá´áśá˝ á á áĽá á¨á፠á ááá áĽááááłá¸áááᣠáŤáááᣠá¨á፠á áá áá° á ááłááľ áááá 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);
}
á áĽááἠá áá ááłá áá áĽáŠá áááľá á¨áá -ááááąá áááťá¸áľ áááľá áŤáááá á ááľááá áá°áŁ á¨áááá -áááą áá áŤááá áá ááááľ áĽá á á.á˛.Რáá ááŤá áá ᣠá áĽáá፠á áá á áá áá° 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# á ááŁáĽ á áááᣠá áá ááłá áá á¨áá°á á á°ááŁá áá á°ááłáłá ááááá˘
á¨á°ááŁá ááá ááĽáŽá˝áĄ á°ááŁáŤáľá á¨ááľááá áľááśá˝á ááľá°áłá°á
áĽá á¨áááľ á¨ááááá á¨áááĽáá á¤áá á ááá ááᢠá°ááŁá áááááĽá áĽá á°áá˝áŚáášá˘ áá°á á˛á TPL á°ááŁáŤáľá á ááŽá˝ ááľáĽ á¨áá°áŤá¨áľ áľááśá˝á á¨ááľá°áłá°á á˝ááł áĽááłáá á áľááľá á á áťááᢠáĽáá°ááá áŤááľ áľááśá˝ á¨á°ááášáľ á á°ááŁá áááááĽá ááá ááŤážá˝ ááľáĽ ááᢠá¨ááŤáľáááá ááááá áľááľ áááľ ááťáá á á¤á°-áá˝áááľ ááľáĽ ááááᢠParallelExtensionsExtrasá ááááŽáśááľ á¨á°á°áŤáŁ áá á¨.NET á áŤá áŤáááᣠáá áĽáá° áááľ áĽá á á¨áá¨á ᢠá ááłááśášá áŁáአáĽáááá¨áľáĄ-
- CurrentThreadTask Scheduler - á áá áŁáá áá áá á°ááŁáŤáľá áŤá¨áááá
- á¨á°ááŁá á°á¨á á¨á°ááŁá áááááĽá á¨á°áá°á - á áááŁáłá ááľáĽ á°ááŁáááľ áŁáá áááŞáŤ N á á ááľ áá á¨áá¨ááá á°ááŁáŤáľá áááľáŁá
- á¨áłáá á°ááŁá áááááĽá - á¨á°áá°á ConcurrencyLevelTaskScheduler(1) á°áĽá ááááťáᣠáľááá á°ááŁáŽáš á á á°á á°á¨á°á áá¨ááááá˘
- á¨áľáŤ ááľá¨á
á°ááŁá áááááĽá - ááłáŞáŤáá˝
áĽáŤ-ááľá¨á á¨á°ááŁá áľáááľ á ááŤá¨áĽ. áĽáá° áĽáááą á¨áá, á¨á°áᨠThreadpool áá. á˝ááŠá áááłá á NET ThreadPool ááľáĽ á¨áááááłááľ ááá áá ᣠáááá á áááŹá˝áá˝ á áṠᣠáá áááľ á á ááľ á¨ááŽááŤá ááá ááľáĽ á¨áá á á áá ááŤá ááá á áááŁáĽ áá áá á ááá áá á¨áááŽá˝ ááłáśá˝á áŤáľá¨áľáá áááľ ááᢠá¨áá á á áá á¨áĽáá°áá á áááľ ááľááśá˝ áááľá¤ áá áĽáá°áá ááá¨áłáľ áĽá á á áŁá á áľá¸á᪠áá. áŤá˘ á¨áľáŹáľáá á á ááá á á á áĽá áá°áá á á ááá˝ááŁá¸á á¨ááŽááŤá áááá˝ ááľáĽ á¨á°áᨠWorkStealingTaskSchedulers áá áá ááŤáľááá áá˝ááᢠ- QueuedTask Scheduler - á á áľá áá¨á á°ááŚá˝ áá°á¨áľ áľáŤáá˝á áĽáá˛áá˝á ááá áľáááłá
- ThreadPerTask Scheduler - á áĽáą áá ááá°áá á¨á ááĽáŤááłááą á°ááŁá á¨á°áᨠáá áááĽáŤá. ááá¨á¨áľ áŤáá°á á á áá ááááľáą á°ááŁáŤáľ á áá ááá áá˝áá.
áĽáŠ áááá á á
á¨á°ááŁáŽá˝ áá áá°áŤáŤá áááŽá˝ áá ááš áá¨á áŞáĽáá áľáąá˛áŽ á¨á°ááŁá ááľáŽáľ á ááᢠá áá ááľáŽáľ ááľáĽ á áá áŤááá á¨áľáŤáá áááł áá¨áľ áĽá á áá áá°áá°áŤá á¨áŽáľ ááľáá áááá áá˝áá.
PLinq áĽá áľáአááá
á¨á°ááŁáŽá˝ áĽá á NET ááľáĽ á¨á°áááŠáľ áááŽá˝ á á°á¨á᪠áááľ á°á¨á᪠á áľá°áłá˝ ááłáŞáŤáá˝ á áᥠPLinq(Linq2Parallel) áĽá Parallel classᢠá¨ááááŞáŤá áááá á¨ááá áľáŤáá˝ á á ááŤáł ááŽá˝ áá á áľáአáááľáŹáľ áá ááĽáˇá. á¨ááŽá˝ áĽááľ á WithDegreeOfParallelism á
áĽáŤ áá´ áááá áá˝ááᢠáĽáá° á áááłá°á áá áĽááá áá PLinq á ááŁáŞ áááłá ââáľá á¨ááἠáááá ááľáŁá áááŽá˝ á á áá¨á á ááá¨áá ᣠá áá á áŠá á°áá á¨ááá¨á áá á áŁá áá
á°á áá-á¨áá
á ááľ áá° AsParallel áá´ áá°áá áŤáľáááááłáᢠá¨ááá áá´ á°áá°ááľ áĽá á¨á áááá áá¨áŤáá˝á áŤá¨ááá. á á°á¨ááŞáᣠáľá á¨ááἠáááá á°ááĽáŽ á°á¨á᪠áá¨á áááááá˝ áá´á á áá áá á PLinq ááľá°ááá ááťááᢠá¨á áá ááá ἠáľá˝ááá
á¨áľáłá˛á áľáአááá á Foreach áľáĽáľáĽ á áľáአáááľáá ᣠáá loopá áááľááá áĽá á Invoke áľáአááľáĽ áĽá á°ááŤáŽá˝á á¨ááľáá¸á፠áá´áá˝á áá°áŁáᢠáľááśáš á¨áá ááá á ááľ á¨á áá áá á áááá áááá. ParallelOptionsá áĽáá° á¨áá¨á¨áťá áá᪠áĽá´áľ á ááá á¨ááŽá˝ áĽááľ áááá áá˝ááᢠáĽáá˛áá á ááŤáŽá˝á á áá áá TaskScheduler áĽá CancellationTokená áááá˝ áá˝ááá˘
áááśá˝
áá á á˝áá ááťá á¨ááááŠáľ á¨áŞááá´ áááľ áĽá á¨áą á áá á áľáŤáŹ á¨á°á á°áĽáŠáľá áá¨á áá°á¨áľ á ááľá¨á áĽá áááá áĽáŹ á áá á áŠá áá áᢠá áá áĽá áá á á˝áá á¨áá˝áá áľ á¨á˝áá á ááłá˘ 15áá áá˝ áĽáá°áá° á˛ááá¨á ááŤá¨áá áá¤áśášá á á áááááᢠááá˝ áĽáááśá˝áŁ á¤áá ááá˝áŁ á¨áĽááł ááłáŞáŤáá˝ áĽá ááĽááśá˝ á áááĽáá áááľ ááľáĽ áá¸áááá˘
áá°áá°ááŤ-
- á¨áááá áá˛áá˝á ááĽáśá˝ ááá áá á¨áá, á°ááłáłáááľ áĽá áľáአáá áááľáŤáľ ááłáŞáŤáá˝á ááá á ááĽááľ.
- ááá ááá á NET ááľáĽ áĽá á¨á°ááŤáŠ ááłáŞáŤáá˝ á á.
- ááá á á ááľ áá á ááłáŠá, ááááŤáąá áĽá áá á ááśá˝á ááááľ áá˝áá, ááá áá, áŤá áĽá áĽá¨áľ á¨áľáŽ á¤áá ááá˝á ááááἠááááśá˝ á á.
- á NET ááľáĽ áŤáá áá á Thread áĽá ThreadPool áááá˝ ááá¨ááá˘
- Thread.Abort, Thread.Interrupt, TerminateThread Win32 API á°ááŁáŤáľ á á°áá áá¸á áĽá á ááá¨áá. á ááľáŠáŁ á¨CancelationTokens áá´á áá áá á¨á°áťá ááá˘
- áá°áą á áá ááĽáľ áá, ááĽáŤá¸á á¨á°áá°á áá. ááŽá˝ ááľá°áśá˝á á áá á á á¨á°á ááąá áľá áááłáá˝ áŤáľáááąá˘ áá áá áááľá¨á ᨠTaskCompletionSource áááá ááá áá ááš áá.
- á áŁá áááá áĽá á¨áá ᨠ.NET ááłáŞáŤáá˝ á¨áŽááá¨ááľ áĽá á°ááłáłáááľ áá á¨á°áŤáŤá á°ááŁáŤáľ áá¸á.
- c# á áľáá/á¨áá áŁá á ááááŤáá˝ áá á á á á ááááľ á¨áááá á˝áá° ááłáĽ á°ááŁáŤá áŤá°ááá
- TaskScheduler á°áá˝áŚ áááá˝á á áá áá á áá ááŤá¨á á¨á°ááŁá áľáááľá áááŁá á áľá˝ááá
- á¨ValueTask ááá á áá ááááśá˝á áĽá á¨ááľáłááľ-áľáŤááá ááááťá¸áľ á áá ááá áá˝ááá˘
- ᨠVisual Studio á¨á°ááŁá áĽá ááŽá˝ ááľáŽáśá˝ áŁááĽá-áá ááá áŤáá°ááłá°á áŽáľ ááá¨á áĽá á áá áá¨ááá˝á áá°áŁáá˘
- PLinq áĽáŠ ááŁáŞáŤ ááᣠááá áá áľá á¨ááἠáááá á á áá¨á áááá¨á áá˝ááᣠááá áá áá á¨áá¨ááá áá´á á áá áá ááľá°áŤá¨á áá˝áá
- áááĽááâŚ
ááá: hab.com