ΠΡΠ±Π»ΠΈΠΊΡΡ Π½Π° Π₯Π°Π±Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π» ΡΡΠ°ΡΡΠΈ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠΌ
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ, Π½Π΅ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π΄Π΅ΡΡ ΠΈ ΡΠ΅ΠΉΡΠ°Ρ, ΠΈΠ»ΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΌΠΈ Π΅Π΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ°ΠΌΠΈ Π±ΡΠ»Π° ΠΈ Π΄ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠ². Π‘ ΠΈΡ
ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΠΊΠ°Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΡΠ°Π»Π° ΠΎΡΠ΅Π½Ρ ΠΎΡΡΡΠΈΠΌΠΎΠΉ. Π‘Π΅ΠΉΡΠ°Ρ, Π² 2019, Π½Π°Π±ΠΈΡΠ°Ρ ΡΡΡ ΡΡΠ°ΡΡΡ Π½Π° Π½ΠΎΡΡΠ±ΡΠΊΠ΅ Ρ 8 ΡΠ΄Π΅ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ Intel Core, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΡΡΠΎΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅ ΠΎΠ΄Π½Π° ΡΠΎΡΠ½Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΡΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅. Π ΡΠ΄ΠΎΠΌ, Π»Π΅ΠΆΠΈΡ ΡΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅ΠΏΠ°Π½Π½ΡΠΉ, ΠΊΡΠΏΠ»Π΅Π½Π½ΡΠΉ ΠΏΠ°ΡΡ Π»Π΅Ρ Π½Π°Π·Π°Π΄ ΡΠ΅Π»Π΅ΡΠΎΠ½, Ρ Π½Π΅Π³ΠΎ Π½Π° Π±ΠΎΡΡΡ 8 ΡΠ΄Π΅ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ. ΠΠ° ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΡΡΡΠ°Ρ
ΠΏΠΎΠ»Π½ΠΎ ΡΡΠ°ΡΠ΅ΠΉ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ, Π³Π΄Π΅ ΠΈΡ
Π°Π²ΡΠΎΡΡ Π²ΠΎΡΡ
ΠΈΡΠ°ΡΡΡΡ ΡΠ»Π°Π³ΠΌΠ°Π½ΡΠΊΠΈΠΌΠΈ ΡΠΌΠ°ΡΡΡΠΎΠ½Π°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° ΠΊΡΠ΄Π° ΡΡΠ°Π²ΡΡ 16ΡΠΈ-ΡΠ΄Π΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ. MS Azure ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅ΠΌ Π·Π° 20$/ΡΠ°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ ΡΠΎ 128 ΡΠ΄Π΅ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ ΠΈ 2 TB RAM. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΈ ΠΎΠ±ΡΠ·Π΄Π°ΡΡ ΡΡΡ ΠΌΠΎΡΡ Π½Π΅ ΡΠΌΠ΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ².
Π’Π΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ
ΠΡΠΎΡΠ΅ΡΡ (Process) β ΠΎΠ±ΡΠ΅ΠΊΡ ΠΠ‘, ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΡΠΎΠΊΠΈ.
ΠΠΎΡΠΎΠΊ (Thread) β ΠΎΠ±ΡΠ΅ΠΊΡ ΠΠ‘, Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠ°ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΏΠΎΡΠΎΠΊΠΈ Π΄Π΅Π»ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΠΏΡΠΎΡΠ΅ΡΡΠ°.
ΠΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΡ β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΠ‘, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ
ΠΠ½ΠΎΠ³ΠΎΡΠ΄Π΅ΡΠ½ΠΎΡΡΡ β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π΅Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ
ΠΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΡΡΡ β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°ΠΌΠΈ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π°Π½Π½ΡΡ
ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΡΡΡ β Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π² Π΅Π΄ΠΈΠ½ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
ΠΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΡΡΡ β Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±Π΅Π· ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ ΠΏΠΎΠ·Π΄Π½Π΅Π΅.
ΠΠ΅ΡΠ°ΡΠΎΡΠ°
ΠΠ΅ Π²ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ ΠΎΡΠΎΡΠΈ ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΠΊ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Ρ ΠΌΠ΅ΡΠ°ΡΠΎΡΡ ΠΎ ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π·Π°Π²ΡΡΠ°ΠΊΠ°. ΠΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΡΡΠ°ΠΊΠ° Π² ΡΡΠΎΠΉ ΠΌΠ΅ΡΠ°ΡΠΎΡΠ΅ β process.
ΠΠΎΡΠΎΠ²Ρ Π·Π°Π²ΡΡΠ°ΠΊ Ρ ΡΡΡΠ° Ρ (CPU) ΠΏΡΠΈΡ ΠΎΠΆΡ Π½Π° ΠΊΡΡ Π½Ρ (ΠΠΎΠΌΠΏΡΡΡΠ΅Ρ). Π£ ΠΌΠ΅Π½Ρ 2 ΡΡΠΊΠΈ (Cores). ΠΠ° ΠΊΡΡ Π½Π΅ Π΅ΡΡΡ ΡΡΠ΄ ΡΡΡΡΠΎΠΉΡΡΠ² (IO): ΠΏΠ΅ΡΡ, ΡΠ°ΠΉΠ½ΠΈΠΊ, ΡΠΎΡΡΠ΅Ρ, Ρ ΠΎΠ»ΠΎΠ΄ΠΈΠ»ΡΠ½ΠΈΠΊ. Π― Π²ΠΊΠ»ΡΡΠ°Ρ Π³Π°Π·, ΡΡΠ°Π²Π»Ρ Π½Π° Π½Π΅Π³ΠΎ ΡΠΊΠΎΠ²ΠΎΡΠΎΠ΄ΠΊΡ ΠΈ Π½Π°Π»ΠΈΠ²Π°Ρ ΡΡΠ΄Π° ΠΌΠ°ΡΠ»ΠΎ, Π½Π΅ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡ ΠΏΠΎΠΊΠ° ΠΎΠ½Π° ΡΠ°Π·ΠΎΠ³ΡΠ΅Π΅ΡΡΡ (Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ, Non-Blocking-IO-Wait), Ρ Π΄ΠΎΡΡΠ°Ρ ΠΈΠ· Ρ ΠΎΠ»ΠΎΠ΄ΠΈΠ»ΡΠ½ΠΈΠΊΠ° ΡΠΉΡΠ° ΠΈ ΡΠ°Π·Π±ΠΈΠ²Π°Ρ ΠΈΡ Π² ΡΠ°ΡΠ΅Π»ΠΊΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²Π·Π±ΠΈΠ²Π°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΊΠΎΠΉ (Thread#1), Π° Π²ΡΠΎΡΠΎΠΉ (Thread#2) ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Ρ ΡΠ°ΡΠ΅Π»ΠΊΡ (Shared Resource). Π‘Π΅ΠΉΡΠ°Ρ Π±Ρ Π΅ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ°ΠΉΠ½ΠΈΠΊ, Π½ΠΎ ΡΡΠΊ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ (Thread Starvation) ΠΠ° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΠΎΠ³ΡΠ΅Π²Π°Π΅ΡΡΡ ΡΠΊΠΎΠ²ΠΎΡΠΎΠ΄ΠΊΠ° (ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°) ΠΊΡΠ΄Π° Ρ Π²ΡΠ»ΠΈΠ²Π°Ρ ΡΠΎ ΡΡΠΎ Π²Π·Π±ΠΈΠ». Π― Π΄ΠΎΡΡΠ³ΠΈΠ²Π°ΡΡΡ Π΄ΠΎ ΡΠ°ΠΉΠ½ΠΈΠΊΠ° ΠΈ Π²ΠΊΠ»ΡΡΠ°Ρ Π΅Π³ΠΎ ΠΈ ΡΡΠΏΠΎ ΡΠΌΠΎΡΡΡ ΠΊΠ°ΠΊ Π²ΠΎΠ΄Π° Π² Π½Π΅ΠΌ Π·Π°ΠΊΠΈΠΏΠ°Π΅Ρ (Blocking-IO-Wait), Ρ ΠΎΡΡ ΠΌΠΎΠ³ Π±Ρ Π·Π° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΌΡΡΡ ΡΠ°ΡΠ΅Π»ΠΊΡ, Π³Π΄Π΅ Π²Π·Π±ΠΈΠ²Π°Π» ΠΎΠΌΠ»Π΅Ρ.
Π― Π³ΠΎΡΠΎΠ²ΠΈΠ» ΠΎΠΌΠ»Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΠ΅Π³ΠΎ 2 ΡΡΠΊΠΈ, Π΄Π° Π±ΠΎΠ»ΡΡΠ΅ Ρ ΠΌΠ΅Π½Ρ ΠΈ Π½Π΅Ρ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π·Π±ΠΈΠ²Π°Π½ΠΈΡ ΠΎΠΌΠ»Π΅ΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΎ ΡΡΠ°Π·Ρ 3 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: Π²Π·Π±ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠΌΠ»Π΅ΡΠ°, ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΠ΅Π»ΠΊΠΈ, ΡΠ°Π·ΠΎΠ³ΡΠ΅Π²Π°Π½ΠΈΠ΅ ΡΠΊΠΎΠ²ΠΎΡΠΎΠ΄ΠΊΠΈ.CPU β ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΠΎΠΉ Π±ΡΡΡΡΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°, IO ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΎΡΠΌΠΎΠ·ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΠ°ΡΡΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°Π½ΡΡΡ ΡΠ΅ΠΌ-ΡΠΎ CPU ΠΏΠΎΠΊΠ° ΠΈΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΎΡ IO.
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΠΌΠ΅ΡΠ°ΡΠΎΡΡ:
- ΠΡΠ»ΠΈ Π±Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΠΎΠΌΠ»Π΅ΡΠ°, Ρ Π±Ρ Π΅ΡΠ΅ ΠΈ ΠΏΡΡΠ°Π»ΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠ΄Π΅ΡΡΡΡ ΡΡΠΎ Π±ΡΠ» Π±Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΆΠ½ΡΠΉ Π½ΡΠ°Π½Ρ: Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠ² Ρ ΡΡΠΈΠΌ ΠΊΡΠ΄Π° Π»ΡΡΡΠ΅ ΡΠ΅ΠΌ Ρ Π»ΡΠ΄Π΅ΠΉ.
- ΠΡΡ Π½Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΠ²Π°ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² ΡΠ΅ΡΡΠΎΡΠ°Π½Π΅ β ΠΌΠ½ΠΎΠ³ΠΎΡΠ΄Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ.
- ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΠΎΡΠ°Π½ΠΎΠ² Π½Π° ΡΡΠ΄ΠΊΠΎΡΡΠ΅ Π² ΡΠΎΡΠ³ΠΎΠ²ΠΎΠΌ ΡΠ΅Π½ΡΡΠ΅ β Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡ
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ .NET
Π ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ, .NET Ρ ΠΎΡΠΎΡ. Π‘ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΎΠ½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½ΠΎΠ²ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌΠΈ, Π½ΠΎΠ²ΡΠ΅ ΡΠ»ΠΎΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π½Π°Π΄ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΠ‘. Π ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, ΡΠΏΡΡΡΠΈΡΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ Π½ΠΈΠΆΠ΅. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π² ΡΡΠΎΠΌ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ ΡΡΠΎ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π»Ρ Π²ΡΡΡΡΠ΅Π»Π° ΡΠ΅Π±Π΅ Π² Π½ΠΎΠ³Ρ ΠΈΠ· Π΄ΡΠΎΠ±ΠΎΠ²ΠΈΠΊΠ°, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π°, Π² ΡΠ΅Π΄ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ , ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π½Π΅ ΡΠ΅ΡΠ°ΡΡΡΡ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΡΠΎΠ²Π½Π΅ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ.
ΠΠΎΠ΄ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Ρ ΠΈΠΌΠ΅Ρ Π²Π²ΠΈΠ΄Ρ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ (API) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠΌ ΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ, ΡΠ°ΠΊ ΠΈ ΡΠ΅Π»ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΠΎΠΈΡΠΊ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.
ΠΠ°ΠΏΡΡΠΊ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠ»Π°ΡΡ Thread, ΡΠ°ΠΌΡΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ Π² .NET Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ²:
- ThreadStart β ΠΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
- ParametrizedThreadStart β Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΠΈΠΏΠ° object.
ΠΠ΅Π»Π΅Π³Π°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π²ΠΎ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Start, Π΅ΡΠ»ΠΈ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π΄Π΅Π»Π΅Π³Π°Ρ ΡΠΈΠΏΠ° ParametrizedThreadStart, ΡΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄ Start Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π»ΡΠ±ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² ΠΏΠΎΡΠΎΠΊ. Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΡΡΠΎ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Π° ΡΠ°ΠΌ ΠΏΠΎΡΠΎΠΊ ΡΡΠΎ ΡΡΠΆΠ΅Π»ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ 1ΠΠ ΠΏΠ°ΠΌΡΡΠΈ Π½Π° ΡΡΠ΅ΠΊ, ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ API ΠΠ‘.
new Thread(...).Start(...);
ΠΠ»Π°ΡΡ ThreadPool ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΏΡΠ»Π°. Π .NET ΠΏΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΡΡΡΡΠ²Π° ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΠ· Microsoft Π²Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠΈΠ»ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π» ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π² ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ .
ΠΠ±ΡΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ:
Π‘ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΡΠ°ΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠ½Π΅ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΡΠΎ Π·Π°ΠΏΠ°Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π±ΡΠ°ΡΡ ΠΈΡ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΡΡΠΎ ΠΈ Π² Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅, ΡΠΎ ΠΏΡΠ» ΡΠ°ΡΡΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠΎΠ³Π΄Π° Π² ΠΏΡΠ»Π΅ Π² Π½ΡΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ½ ΠΈΠ»ΠΈ Π΄ΠΎΠΆΠ΄Π΅ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ², Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ. ΠΠ· ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ ΠΏΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π½Π΅ΠΊΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΈ ΠΏΠ»ΠΎΡ ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΊΠ°ΠΊ ΡΠ»ΡΠΆΠ±Ρ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ· ΠΏΡΠ»Π°, Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ QueueUserWorkItem, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄Π΅Π»Π΅Π³Π°Ρ ΡΠΈΠΏΠ° WaitCallback, ΡΡΠΎ ΠΏΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ParametrizedThreadStart, Π° ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π² Π½Π΅Π³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ.
ThreadPool.QueueUserWorkItem(...);
ΠΠ΅Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² RegisterWaitForSingleObject ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΡ IO ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΠ΅Π»Π΅Π³Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π² ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° WaitHandle ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ Π² ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ βΠΎΡΠΏΡΡΠ΅Π½β(Released).
ThreadPool.RegisterWaitForSingleObject(...)
Π .NET Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΠ½ ΠΎΡ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠ² WinForms/WPF ΡΠ΅ΠΌ, ΡΡΠΎ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ Π² ΠΏΠΎΡΠΎΠΊΠ΅ Π²Π·ΡΡΠΎΠΌ ΠΈΠ· ΠΏΡΠ»Π°.
System.Threading.Timer
Π’Π°ΠΊ ΠΆΠ΅ Π΅ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠΊΠ·ΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π΅Π»Π΅Π³Π°Ρ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡΠΎΠΊ ΠΈΠ· ΠΏΡΠ»Π° β ΠΌΠ΅ΡΠΎΠ΄ BeginInvoke.
DelegateInstance.BeginInvoke
Π₯ΠΎΡΡ Π΅ΡΠ΅ Π²ΡΠΊΠΎΠ»ΡΠ·Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π²ΡΠ·ΠΎΠ²Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² β CreateThread ΠΈΠ· Kernel32.dll Win32 API. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΏΠΎΡΠΎΠ±, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ extern ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π²ΡΠ·Π²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ. Π― Π²ΠΈΠ΄Π΅Π» ΡΠ°ΠΊΠΎΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΈΡΡ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ Π² ΠΆΡΡΡΠ°ΠΉΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ legacy ΠΊΠΎΠ΄Π°, Π° ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ Π°Π²ΡΠΎΡΠ° ΡΠ΄Π΅Π»Π°Π²ΡΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ.
Kernel32.dll CreateThread
ΠΡΠΎΡΠΌΠΎΡΡ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ²
Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π²Π°ΠΌΠΈ Π»ΠΈΡΠ½ΠΎ, Π²ΡΠ΅ΠΌΠΈ ΡΡΠ΅ΡΠΈΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠ»ΠΎΠΌ .NET ΠΏΠΎΡΠΎΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΠΎΠΊΠ½Π΅ Threads Visual Studio. ΠΡΠΎ ΠΎΠΊΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΡΠΎΠΊΠ°Ρ Π»ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ΄ ΠΎΡΠ»Π°Π΄ΠΊΠΎΠΉ ΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²Π° (Break mode). ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠ΅ΠΊ ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ. Π‘Π²ΠΎΠΉΡΡΠ²ΠΎΠΌ Priority ΠΊΠ»Π°ΡΡΠ° Thread ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ OC ΠΈ CLR Π±ΡΠ΄ΡΡ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ ΠΏΡΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ.
Task Parallel Library
Task Parallel Library (TPL) ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π² .NET 4.0. Π‘Π΅ΠΉΡΠ°Ρ ΡΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΡΡ. ΠΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΡΠΈΡΠ°Π΅ΡΡΡ legacy. ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ TPL ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡ Task ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ System.Threading.Tasks. Task ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ Π½Π°Π΄ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. Π‘ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΡΠ·ΡΠΊΠ° C# ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΈΠ·ΡΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ Task`Π°ΠΌΠΈ β ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ async/await. ΠΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ ΠΏΠΈΡΠ°ΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» ΠΏΡΠΎΡΡΡΠΌ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ, ΡΡΠΎ Π΄Π°Π»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π°ΠΆΠ΅ Π»ΡΠ΄ΡΠΌ ΡΠ»Π°Π±ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡΠΈΠΌ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΊΡΡ Π½Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ Π·Π°Π²ΠΈΡΠ°ΡΡΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄ΠΎΠ»Π³ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ async/await ΡΠ΅ΠΌΠ° Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ, Π½ΠΎ Ρ ΠΏΠΎΠΏΡΠΎΠ±ΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΡΠ»ΠΎΠΆΠΈΡΡ ΡΡΡΡ:
- async ΡΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅Π³ΠΎ Task ΠΈΠ»ΠΈ void
- Π° await ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Task`Π°.
ΠΡΠ΅ ΡΠ°Π·: ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ await, Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ (Π΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ), ΠΎΡΠΏΡΡΡΠΈΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π°Π»ΡΡΠ΅, Π° ΠΊΠΎΠ³Π΄Π° Task Π·Π°ΠΊΠΎΠ½ΡΠΈΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π° ΠΏΠΎΡΠΎΠΊ (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅Π΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π΅) Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π΄Π°Π»ΡΡΠ΅. ΠΠ½ΡΡΡΠΈ .NET ΡΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ yield return, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΡΠ΅Π»ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΠΊΡΡΠΊΠ°ΠΌΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ. ΠΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π»ΡΠ±ΠΎΠΉ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΊΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ asynΡ/await, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ JetBrains dotPeek Ρ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ Compiler Generated Code.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ TaskβΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅, ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ (Thread.Sleep(10000)), Π½ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π½Π΅ΠΊΠ°Ρ ΡΠ»ΠΎΠΆΠ½Π°Ρ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠ°Ρ CPU ΡΠ°Π±ΠΎΡΠ°.
using TCO = System.Threading.Tasks.TaskCreationOptions;
public static async void VoidAsyncMethod() {
var cancellationSource = new CancellationTokenSource();
await Task.Factory.StartNew(
// Code of action will be executed on other context
() => Thread.Sleep(10000),
cancellationSource.Token,
TCO.LongRunning | TCO.AttachedToParent | TCO.PreferFairness,
scheduler
);
// Code after await will be executed on captured context
}
Task ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Ρ ΡΡΠ΄ΠΎΠΌ ΠΎΠΏΡΠΈΠΉ:
- LongRunning β ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π·Π°Π΄Π°ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π±ΡΡΡΡΠΎ, Π° Π·Π½Π°ΡΠΈΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎΠΈΡ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ Π½Π°Π΄ ΡΠ΅ΠΌ ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊ ΠΈΠ· ΠΏΡΠ»Π°, Π° ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΠ΄ ΡΡΡ TaskβΡ ΡΡΠΎΠ±Ρ Π½Π΅ Π½Π°Π²ΡΠ΅Π΄ΠΈΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ.
- AttachedToParent β TaskβΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ Π² ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ. ΠΡΠ»ΠΈ Π±ΡΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ° ΠΎΠΏΡΠΈΡ, ΡΠΎ Task ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΌ ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»ΡΡ ΠΈ Π΄ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ .
- PreferFairness β ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΎ Π±Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ TaskβΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π½ΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌΠΈ, ΡΡΠΎ Π±ΡΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠΎ ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½.
ΠΡΠΎΡΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ Π² ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ CancellationToken. ΠΠ»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΌΠ΅Π½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ Π΅Π΅ Π·Π°ΠΏΡΡΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ CancellationToken. ΠΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π½Π΅Ρ, ΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ Cancel Π²ΡΠ·Π²Π°Π½Π½ΡΠΉ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ CancellationTokenSource ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ TaskβΠ° Π»ΠΈΡΡ Π΄ΠΎ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΎΠ±ΡΠ΅ΠΊΡ scheduler ΡΠΈΠΏΠ° TaskScheduler. ΠΡΠΎΡ ΠΊΠ»Π°ΡΡ ΠΈ Π΅Π³ΠΎ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠΌΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ TaskβΠΎΠ² ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Task Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈΠ· ΠΏΡΠ»Π°.
Π ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌΡ TaskβΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ await, Π° Π·Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ Π΅ΡΡΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ (ΡΠ°ΡΡΠΎ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΡΠΎ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅), ΡΡΠΎ ΠΈ ΠΊΠΎΠ΄ Π΄ΠΎ await.
ΠΠ΅ΡΠΎΠ΄ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ async void, ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π² Π½Π΅ΠΌ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° await, Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°, ΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Task. ΠΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ async void Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ: ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈ Π·Π°Π±ΡΡΡ (fire and forget). ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π½ΠΎ ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Task.
ΠΠ° TaskβΠ΅ ΡΡΠΎ Π²Π΅ΡΠ½ΡΠ» ΠΌΠ΅ΡΠΎΠ΄ StartNew, Π²ΠΏΡΠΎΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΈ Π½Π° Π»ΡΠ±ΠΎΠΌ Π΄ΡΡΠ³ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ConfigureAwait Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ false, ΡΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ await ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡΡ Π½Π΅ Π½Π° Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, Π° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ. ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π²ΡΠ΅Π³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄Π»Ρ ΠΊΠΎΠ΄Π° ΠΏΠΎΡΠ»Π΅ await Π½Π΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠ΅ΠΉ ΠΎΡ MS ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΌ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π²ΠΈΠ΄Π΅.
ΠΠ°Π²Π°ΠΉΡΠ΅ Π΅ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ TaskβΠΈ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°, Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΡΠ»ΠΎΠ²Π½ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΈ ΠΊΠΎΠ³Π΄Π° ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΏΠ»ΠΎΡ ΠΎ.
public static async void AnotherMethod() {
int result = await AsyncMethod(); // good
result = AsyncMethod().Result; // bad
AsyncMethod().Wait(); // bad
IEnumerable<Task> tasks = new Task[] {
AsyncMethod(), OtherAsyncMethod()
};
await Task.WhenAll(tasks); // good
await Task.WhenAny(tasks); // good
Task.WaitAll(tasks.ToArray()); // bad
}
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ Π΄ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ TaskβΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π²Π΅ΡΠ½Π΅ΠΌΡΡ Π»ΠΈΡΡ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΡΠΆΠ΅ Π±ΡΠ΄Π΅Ρ, Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ ΡΠ΅Π±Π΅.
ΠΠΎ Π²ΡΠΎΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΌΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°Π½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ Π·Π°Π½ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ, ΡΡΠΎΠ»Ρ ΡΠ΅Π½Π½ΡΠΉ ΡΠ΅ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΎΡΡΡΠΌ Π±Π΅Π·Π΄Π΅Π»ΠΈΠ΅ΠΌ, Π½ΠΎ Π΅ΡΠ΅ ΠΈ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠΎ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π΅ΡΡΡ await, Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΡΠ»Π΅ await, ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ deadlock: Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΆΠ΄Π΅Ρ ΠΏΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°, Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ΅ΡΠ½ΠΎ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅.
ΠΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠΈ Π² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ async/await ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ β ΠΎΠ½ΠΈ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΊΠΎΠ΄ Π±ΡΠ» ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ. Π ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΊΠ·ΠΎΡΡΠΈΠ·ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΊ Taskβe ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π² AggregateException, Ρ.ΠΎ. ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠΈΠΏ InnerException ΠΈ ΡΠ°ΠΌΠΎΠΌΡ ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ if Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ catch Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ catch when, Π²ΠΌΠ΅ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠ²ΡΡΠ½ΠΎΠΉ Π² C# ΠΌΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΡΠΊΠΈ catch Π±Π»ΠΎΠΊΠΎΠ².
Π’ΡΠ΅ΡΠΈΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ΅Π½Ρ ΠΏΠ»ΠΎΡ ΠΈΠΌΠΈ ΠΏΠΎ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π²ΡΠ΅ ΡΠ΅ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠ΅ΡΠΎΠ΄Ρ WhenAny ΠΈ WhenAll ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ΄ΠΎΠ±Π½Ρ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π³ΡΡΠΏΠΏΡ TaskβΠΎΠ², ΠΎΠ½ΠΈ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ Π³ΡΡΠΏΠΏΡ TaskβΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ TaskβΠ° ΠΈΠ· Π³ΡΡΠΏΠΏΡ, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ½ΡΠ°Ρ Π²ΡΠ΅.
ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠΎ ΡΠ°Π·Π½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΡΡΠ°ΡΡΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ΄ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ². Π£ ΠΊΠ»Π°ΡΡΠ° Thread Π΅ΡΡΡ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΌΠΈ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ β ΡΡΠΎ Abort ΠΈ Interrupt. ΠΠ΅ΡΠ²ΡΠΉ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Ρ.ΠΊ. ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π² Π»ΡΠ±ΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π»ΡΠ±ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ThreadAbortedException. ΠΡ Π²Π΅Π΄Ρ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ»Π΅ΡΠΈΡ ΠΏΡΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²Π΅ΡΠ½ΠΎ? Π ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ΅Π°Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ. Π ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ CLR Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠ°ΡΡΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² Π²ΡΠ·ΠΎΠ²Ρ Thread.BeginCriticalRegion, Thread.EndCriticalRegion. Π’Π°ΠΊΠΈΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² finally Π±Π»ΠΎΠΊΠ΅. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ Π² Π½Π΅Π΄ΡΠ°Ρ ΠΊΠΎΠ΄Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π±Π»ΠΎΠΊΠΈ Ρ ΠΏΡΡΡΡΠΌ try, Π½ΠΎ Π½Π΅ ΠΏΡΡΡΡΠΌ finally. Microsoft Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΠΎ Π½Π΅ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ Π΅Π³ΠΎ Π² .net core.
ΠΠ΅ΡΠΎΠ΄ Interrupt ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΡΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ThreadInterruptedException ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. Π ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ½ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄Π²ΠΈΡΠ°Ρ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ WaitHandle, lock ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° Thread.Sleep.
ΠΠ±Π° ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π²ΡΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΠ°, ΠΏΠ»ΠΎΡ ΠΈ ΡΠ²ΠΎΠ΅ΠΉ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΡΡΡΡ. ΠΡΡ ΠΎΠ΄ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ CancellationToken ΠΈ ΠΊΠ»Π°ΡΡΠ° CancellationTokenSource. Π‘ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ: ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ° CancellationTokenSource ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΡ ΠΊΡΠΎ ΠΈΠΌ Π²Π»Π°Π΄Π΅Π΅Ρ, ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΡΠ·Π²Π°Π² ΠΌΠ΅ΡΠΎΠ΄ Cancel. Π ΡΠ°ΠΌΡ ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π»ΠΈΡΡ CancellationToken. ΠΠ»Π°Π΄Π΅Π»ΡΡΡ CancellationToken Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠ°ΠΌΠΈ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Π° ΠΌΠΎΠ³ΡΡ Π»ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π΅ Π±ΡΠ»Π° Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΡΠΌΠ΅Π½Π΅Π½Π°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΅ΡΡΡ Π±ΡΠ»Π΅Π²ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ IsCancellationRequested ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ThrowIfCancelRequested. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ TaskCancelledException Π΅ΡΠ»ΠΈ Π½Π° ΠΏΠ°ΡΠΎΠ΄ΠΈΠ²ΡΠ΅ΠΌ CancellationToken ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ CancellationTokenSource Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ Cancel. Π ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΡΠΎ Π»ΡΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ΅ΠΌ Π² ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½Π°.
Π‘Π°ΠΌΡΠΌ ΠΆΠ΅ΡΡΠΎΠΊΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Win32 API TerminateThread. ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ CLR ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ. ΠΠ° MSDN ΠΆΠ΅ ΠΏΡΠΎ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: βTerminateThread is a dangerous function that should only be used in the most extreme cases. β
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ legacy-API Π² Task Based Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° FromAsync
ΠΡΠ»ΠΈ Π²Π°ΠΌ ΠΏΠΎΡΡΠ°ΡΡΠ»ΠΈΠ²ΠΈΠ»ΠΎΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΡΡΠΎ Π±ΡΠ» Π½Π°ΡΠ°Ρ ΡΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ TaskβΠΈ Π±ΡΠ»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΈΡ ΠΈΠΉ ΡΠΆΠ°Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΠΎ Π²Π°ΠΌ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΡΠ°ΡΡΡ 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 Π΅Π³ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΌΠΈ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ legacy-API Π² Task Based Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»Π°ΡΡΠ° TaskCompletionSource
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ Π΄Π»Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ TaskCompletionSource. ΠΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌ, Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ°Π±ΠΎΡΡ ΠΎΠ½ ΡΠ΅ΠΌ-ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ RegisterWaitForSingleObject ΠΊΠ»Π°ΡΡΠ° ThreadPool ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΠΏΠΈΡΠ°Π» Π²ΡΡΠ΅. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΡΠ°ΡΡΠ΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ API Π² TaskβΠΈ.
ΠΡ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅, ΡΡΠΎ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ» ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π΅ FromAsync ΠΊΠ»Π°ΡΡΠ° TaskFactory ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠΌ Π΄Π»Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ. ΠΠ΄Π΅ΡΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ Π²ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΡΠ°Π·Π²ΠΈΡΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² .net ΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π» microsoft Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 15 Π»Π΅Ρ: Π΄ΠΎ Task-Based Asynchronous Pattern (TAP) ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Asynchronous Programming Pattern (APP), ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ BeginDoSomething Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅ΠΌ IAsyncResult ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ EndDoSomething Π΅Π³ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΌ ΠΈ Π΄Π»Ρ legacy ΡΡΠΈΡ Π³ΠΎΠ΄ΠΎΠ² ΠΊΠ°ΠΊ ΡΠ°Π· ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ FromAsync, Π½ΠΎ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, Π½Π° ΡΠΌΠ΅Π½Ρ Π΅ΠΌΡ ΠΏΡΠΈΡΠ΅Π» Event Based Asynchronous Pattern (EAP), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», ΡΡΠΎ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅.
TaskCompletionSource ΠΊΠ°ΠΊ ΡΠ°Π· ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΡΠΊΠΈ Π² TaskβΠΈ legacy-API ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΡ Π²ΠΎΠΊΡΡΠ³ ΡΠΎΠ±ΡΡΠΈΠΉΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π‘ΡΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ: Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π΅ΡΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠΈΠΏΠ° Task ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄Ρ SetResult, SetException ΠΈ ΠΏΡ. ΠΠ»Π°ΡΡΠ° TaskCompletionSource. Π ΠΌΠ΅ΡΡΠ°Ρ ΠΆΠ΅ Π³Π΄Π΅ Π±ΡΠ» ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ await ΠΊ ΡΡΠΎΠΌΡ TaskβΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΡΠ΅Π½ Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊ TaskCompletionSource ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΡΠ»ΠΈ Π²ΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ Π½Π΅ΠΊΠΎΠ΅ ΡΡΠ°ΡΠΎΠ΅ API Π²ΡΠ΅ΠΌΠ΅Π½ EAP Π·Π°Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π² Task ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ TaskCompletionSource: ΠΏΡΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ Task Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Completed, Π° ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉ ΠΊ ΡΡΠΎΠΌΡ TaskβΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ await Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡ result.
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
ΠΠ±Π΅ΡΡΠΊΠ° ΡΡΠ°ΡΡΡ API ΡΡΠΎ Π½Π΅ Π²ΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ½ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ TaskCompletionSource. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ API, Π½Π° TaskβΠ°Ρ , ΡΡΠΎ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ. Π ΠΏΠΎΡΠΎΠΊ, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΌΠ½ΠΈΠΌ ΡΠ΅ΡΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎΠΉ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ (Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ RAM). ΠΡΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡΠΈΡΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠ΅ web-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎ ΠΊΠΎΡΠΎΡΡΡ Ρ Π³ΠΎΠ²ΠΎΡΡ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΡΡΠΊΠ° ΠΊΠ°ΠΊ Long-Polling.
ΠΡΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΎ ΡΡΡΡ ΡΡΡΠΊΠ° Π²ΠΎΡ Π² ΡΠ΅ΠΌ: Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡ API ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ Π½Π° Π΅Π³ΠΎ ΡΡΠΎΡΠΎΠ½Π΅, ΠΏΡΠΈ ΡΡΠΎΠΌ API ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎ ΡΠΎΠ±ΡΡΠΈΠΈ, Π° ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈΡΡ Π²Π΅ΡΠ½ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΈΡ β Π²ΡΠ΅ API ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΡ HTTP Π΄ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ WebSocket ΠΈΠ»ΠΈ ΠΏΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ. ΠΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΡΠΎΡΠΈΡΡ Ρ HTTP ΡΠ΅ΡΠ²Π΅ΡΠ°. HTTP ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΌ ΡΠΏΡΠΎΠ²ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΡΠΎΡΡΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΡ, Π½ΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ TimerInterval / 2. ΠΠ»Ρ ΠΎΠ±Ρ ΠΎΠ΄Π° ΡΡΠΎΠ³ΠΎ Π±ΡΠ» ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ΅Π½ ΡΡΡΠΊ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Long Polling, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΡΠ΅ΡΠ΅Ρ Timeout ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅. ΠΡΠ»ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ, ΡΠΎ ΠΎΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎ Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ.
while(!eventOccures && !timeoutExceeded) {
CheckTimout();
CheckEvent();
Thread.Sleep(1);
}
ΠΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠ΅Π±Ρ ΡΠΆΠ°ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΠ»ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π²ΡΡΠ°ΡΡΠ΅Ρ, Ρ.ΠΊ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°ΠΊΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅Π»ΡΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ Π² 1ΠΌΡ Π½Π° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ, ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π½ΠΎ Π·Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π°ΡΡ ΠΠ Ρ ΡΠΆΠ΅ ΡΠ΅ΠΌ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ? ΠΡΠ»ΠΈ ΠΆΠ΅ ΡΠ±ΡΠ°ΡΡ 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);
}
}
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ production-ready, Π° Π»ΠΈΡΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌ. ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ Π΅ΡΠ΅, ΠΊΠ°ΠΊ-ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ³Π΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ»ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ: Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠ΅ΡΠΎΠ΄ AsseptMessageAsync Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΠ½ΡΡΡ ΡΠΆΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΉ Task. ΠΡΠ»ΠΈ ΠΆΠ΅ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΡΠΌ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ ΠΈ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ValueTask.
ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π² ΡΠ»ΠΎΠ²Π°ΡΡ TaskCompletionSource, Π° Π΄Π°Π»Π΅Π΅ ΠΆΠ΄Π΅ΠΌ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΏΠ΅ΡΠ²Π΅Π΅: ΠΈΡΡΠ΅ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ValueTask: Π·Π°ΡΠ΅ΠΌ ΠΈ ΠΊΠ°ΠΊ
ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ async/await ΠΊΠ°ΠΊ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ yield return Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠ°ΡΠΈΠ½Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ, Π° ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΡΠΎ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, Π½ΠΎ Π² ΡΠ΅Π΄ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΡΠΈΠΌ ΡΠ»ΡΡΠ°Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ, ΡΠ΅ΡΡ ΠΎ Π΄Π΅ΡΡΡΠΊΠ°Ρ ΠΈ ΡΠΎΡΠ½ΡΡ ΡΡΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΊ, ΡΡΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±Ρ ΠΎΠ΄Ρ Π²ΡΠ΅ await ΠΌΠ΅ΡΠΎΠ΄Ρ, ΡΠΎ .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);
}
ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΆΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ hot-path, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠ»ΠΎΠ²Π°ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΠΉ ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° 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# Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±ΡΡΠ½ΡΠΉ Task Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
TaskSchedulerβΡ: ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠΌΠΈ Π·Π°ΠΏΡΡΠΊΠ° TaskβΠΎΠ²
Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ API, ΡΡΠΎ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ ΠΊΠ»Π°ΡΡ TaskScheduler ΠΈ Π΅Π³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅. Π― ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π» Π²ΡΡΠ΅, ΡΡΠΎ Π² TPL Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠΌΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ TaskβΠΎΠ² ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ. Π’Π°ΠΊΠΈΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π² Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ°Ρ ΠΊΠ»Π°ΡΡΠ° TaskScheduler. ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±Π°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ParallelExtensionsExtras, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠΉ microsoft, Π½ΠΎ Π½Π΅ ΡΠ²Π»ΡΡΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΡΡ .NET, Π° ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π² Π²ΠΈΠ΄Π΅ Nuget ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠΎΡΠΎΡΠΊΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ :
- CurrentThreadTaskScheduler β Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ TaskβΠΈ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
- LimitedConcurrencyLevelTaskScheduler β ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΈΡΠ»ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ TaskβΠΎΠ² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ N, ΡΡΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅
- OrderedTaskScheduler β ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ LimitedConcurrencyLevelTaskScheduler(1), ΠΏΠΎΡΠΎΠΌΡ Π·Π°Π΄Π°ΡΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
- WorkStealingTaskScheduler β ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ
work-stealing ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ. ΠΠΎ ΡΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ThreadPool. Π Π΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π² .NET ThreadPool ΡΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ»Π°ΡΡ, ΠΎΠ΄ΠΈΠ½ Π½Π° Π²ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π° Π·Π½Π°ΡΠΈΡ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ° ΠΈΠ»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌ ΡΡΡΠ΅ΠΊΡΠ°ΠΌ Π² Π΄ΡΡΠ³ΠΎΠΉ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ ΠΏΠΎΠ½ΡΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΡΠ°ΠΊΠΈΡ Π΄Π΅ΡΡΠ΅ΠΊΡΠΎΠ² ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎ. Π’.ΠΎ. ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ WorkStealingTaskSchedulerβΡ Π² ΡΠ΅Ρ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ThreadPool ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠΌ ΠΈ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ. - QueuedTaskScheduler β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°ΠΌΠΈ
- ThreadPerTaskScheduler β ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Task ΡΡΠΎ Π½Π° Π½Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ Π·Π°Π΄Π°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ Π΄ΠΎΠ»Π³ΠΎ.
ΠΡΡΡ Ρ
ΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ
ΠΠ»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ TaskβΠ°ΠΌΠΈ Π² Visual Studio Π΅ΡΡΡ ΠΎΠΊΠ½ΠΎ Tasks. Π ΡΡΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΡΠΎΡΠΊΠ΅ ΠΊΠΎΠ΄Π°.
PLinq ΠΈ ΠΊΠ»Π°ΡΡ Parallel
ΠΡΠΎΠΌΠ΅ TaskβΠΎΠ² ΠΈ Π²ΡΠ΅Π³ΠΎ Ρ Π½ΠΈΠΌΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² .NET Π΅ΡΡΡ Π΅ΡΠ΅ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΡΡΠΎ PLinq(Linq2Parallel) ΠΈ ΠΊΠ»Π°ΡΡ Parallel. ΠΠ΅ΡΠ²ΡΠΉ ΠΎΠ±Π΅ΡΠ°Π΅Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
Linq ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠΎΡΠΎΠΊΠ°Ρ
. Π§ΠΈΡΠ»ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ-ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ WithDegreeOfParallelism. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ PLinq Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ Ρ
Π²Π°ΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΎΡΡΡΡ
Π²Π°ΡΠ΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ
, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²ΡΠΈΠ³ΡΡΡ ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ, Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅Π½Π° ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΎΡΠ΅Π½Ρ Π½ΠΈΠ·ΠΊΠ°Ρ: Π½ΡΠΆΠ½ΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ AsParallel ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΏΠΎΡΠΊΠΎΠΉ Linq ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² PLinq Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΈΡΠΎΠ΄Π΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° Partitions. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ»Π°ΡΡ Parallel ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ Foreach, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΠ»Π° For ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ² Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»Ρ Invoke. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π΄ΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΠ΅ΡΠΎΠ². ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π² ParallelOptions ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΉ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ TaskScheduler ΠΈ CancellationToken.
ΠΡΠ²ΠΎΠ΄Ρ
ΠΠΎΠ³Π΄Π° Ρ Π½Π°ΡΠΈΠ½Π°Π» ΠΏΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΠ°ΡΡΡ ΠΏΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°ΠΌ ΡΠ²ΠΎΠ΅Π³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΡΠΎ ΡΠΎΠ±ΡΠ°Π» Π·Π° Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π³ΠΎ, Ρ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π», ΡΡΠΎ Π΅Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ. Π‘Π΅ΠΉΡΠ°Ρ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ Π½Π°Π±ΠΈΡΠ°Ρ ΡΡΡ ΡΡΠ°ΡΡΡ ΡΠΊΠΎΡΠΈΠ·Π½Π΅Π½Π½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΌΠ½Π΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΡΠ»Π° 15Ρ ΡΡΡΠ°Π½ΠΈΡΠ°, Ρ ΠΏΠΎΠ΄Π²Π΅Π΄Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΠΈΡΠΎΠ³ΠΈ. ΠΡΡΠ³ΠΈΠ΅ ΡΡΡΠΊΠΈ, API, Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅.
ΠΡΠ²ΠΎΠ΄Ρ:
- ΠΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΡΡ ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΡΡΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΠ.
- Π .NET ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ
- ΠΠ΅ Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΡΡΠ°Π·Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΠ°ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ΅ΡΠΈΡΡ legacy, Π²ΠΏΡΠΎΡΠ΅ΠΌ Π΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°ΡΡΡ API Π±Π΅Π· ΠΎΡΠΎΠ±ΡΡ ΡΡΠΈΠ»ΠΈΠΉ.
- Π Π°Π±ΠΎΡΠ° Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π² .NET ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ Thread ΠΈ ThreadPool
- ΠΠ΅ΡΠΎΠ΄Ρ Thread.Abort, Thread.Interrupt, ΡΡΠ½ΠΊΡΠΈΡ Win32 API TerminateThread ΠΎΠΏΠ°ΡΠ½Ρ ΠΈ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΌΠ΅ΡΡΠΎ Π½ΠΈΡ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ CancellationTokenβΠΎΠ²
- ΠΠΎΡΠΎΠΊ β ΡΠ΅Π½Π½ΡΠΉ ΡΠ΅ΡΡΡΡ, ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ. ΠΡΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°Π½ΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ TaskCompletionSource
- ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡΠ½ΡΠΌ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² .NET Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡΡΡ ΡΠ²Π»ΡΡΡΡΡ TaskβΠΈ.
- ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ c# async/await ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ
- Π£ΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ TaskβΠΎΠ² ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ TaskSchedulerβΡ ΠΊΠ»Π°ΡΡΠΎΠ²
- Π‘ΡΡΡΠΊΡΡΡΠ° ValueTask ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Π° Π² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ hot-paths ΠΈ memory-traffic
- ΠΠΊΠ½Π° Tasks ΠΈ Threads Visual Studio ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ
- PLinq ΠΊΡΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½ΠΎ Ρ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π±ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π²Π°ΡΠ΅ΠΌ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ΅ Π΄Π°Π½Π½ΡΡ , Π²ΠΏΡΠΎΡΠ΅ΠΌ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° partitioning
- ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ…
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com