Stathread c Ρ‡Ρ‚ΠΎ это

STAThread Attribute Класс

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

НСкоторыС свСдСния относятся ΠΊ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎ выпуска ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ внСсСны сущСствСнныС измСнСния. ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠΎΡ„Ρ‚ Π½Π΅ прСдоставляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, явных ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌΡ‹Ρ…, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… здСсь свСдСний.

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ модСлью COM для прилоТСния являСтся ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (STA).

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° ( Main() ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² C# ΠΈ Visual Basic). Он Π½Π΅ влияСт Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ состояниС Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², запускаСмых Π² ΠΊΠΎΠ΄Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Thread.SetApartmentState Thread.TrySetApartmentState ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… модСлях COM см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния ΠΈ использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ COM.

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ COM ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ прилоТСниям, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ COM-взаимодСйствиС. Для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ COM ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅. ΠŸΠΎΡ‚ΠΎΠΊ прилоТСния инициализируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для COM-взаимодСйствия, Ссли ΠΏΠΎΡ‚ΠΎΠΊ фактичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ COM-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Если COM-взаимодСйствиС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ инициализируСтся, Π° STAThreadAttribute Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ссли ΠΎΠ½ сущСствуСт, Π½Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ влияния.

Π―Π·Ρ‹ΠΊΠœΠΎΠ΄Π΅Π»ΡŒ подраздСлСния COM
C#ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅
C++ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅
Visual BasicΠžΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ STAThreadAttribute Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ модСль для прилоТСния, ΠΈΠ»ΠΈ Thread.SetApartmentState Thread.TrySetApartmentState ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΏΠΎΡ‚ΠΎΠΊΠ° для установки ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ. Π’ C++ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° /CLRTHREADATTRIBUTE для указания ΠΌΠΎΠ΄Π΅Π»ΠΈ подраздСлСния.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ случаи, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ STAThreadAttribute Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ явно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ модСль Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Windows Forms. Windows прилоТСния Ρ„ΠΎΡ€ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌΠΈ, Ссли ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с WindowsΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ систСмы, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΠ»ΠΈ Windows ΠΎΠ±Ρ‰ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°, ΠΈΠ»ΠΈ Ссли ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ систСмныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСтаскивания. шаблон прилоТСния Windows Forms для c# автоматичСски добавляСт STAThreadAttribute Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ c#. Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ модСль Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π° с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Visual Basic, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π΅ трСбуСтся.

Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ C#, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Visual Basic, которая, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ COM-взаимодСйствиС. ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ модСль ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ подраздСлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Visual Basic, слСдуСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ модСль ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² прилоТСния Π½Π° ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ STAThreadAttribute Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСт Π²Ρ‹Π·ΠΎΠ²Ρ‹ COM-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… модСль ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ подраздСлСния.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр класса STAThreadAttribute.

Бвойства

Π’ случаС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Attribute.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, Ρ€Π°Π²Π΅Π½ Π»ΠΈ экзСмпляр ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ…ΡΡˆ-ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ экзСмпляра.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Type для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ экзСмпляра.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого экзСмпляра Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, являСтся Π»ΠΈ этот экзСмпляр Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½Π΅ΠΏΠΎΠ»Π½ΡƒΡŽ копию Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Object.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π―Π²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса

БопоставляСт Π½Π°Π±ΠΎΡ€ ΠΈΠΌΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² диспСтчСризации.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свСдСния ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния свСдСний ΠΎ Ρ‚ΠΈΠΏΠ΅ интСрфСйса.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство прСдоставляСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ интСрфСйсов для доступа ΠΊ свСдСниям ΠΎ Ρ‚ΠΈΠΏΠ΅ (0 ΠΈΠ»ΠΈ 1).

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ доступ ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ свойствам ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Stathread c Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ этоЧто Ρ‚Π°ΠΊΠΎΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹?
НуТСн Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹, Π½Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ? Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора?
ΠšΠΎΡ€ΠΎΡ‡Π΅,Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰ΠΈ,задаю вопрос Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·,поэтому,Ссли ΡƒΠΆΠ΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΈ,Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΡƒ прощСния,Π½ΠΎ я Π·Π°Π±Ρ‹Π».

Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Stathread c Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ этоЧто Ρ‚Π°ΠΊΠΎΠ΅ абстрактныС классы ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹?
Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь, Ρ„ΠΎΡ€ΡƒΠΌ, Ρ€Π΅ΡˆΠΈΠ» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ свои знания c# ΠΈ Π½Π°Ρ‡Π°Π» с абстрактных классов(Ρ€Π°Π½ΡŒΡˆΠ΅.

РСшСниС

Π§Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… для Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ². Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация, которая Π½Π΅ вписываСтся Π² модСль, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ с принятиСм Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΈΠ»ΠΈ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Π΅/Ρ‡Π»Π΅Π½Π°Ρ… сторонним классам.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΆΠ΅, Π·Π°Ρ‡Π΅ΠΌ Π°ΡƒΠ΄ΠΈΠΎ-Ρ„Π°ΠΉΠ»Π°ΠΌ: полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π² Π½ΠΈΡ… β€” это Π±Π°ΠΉΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄ΡƒΡ‚ Π½Π° Π°ΡƒΠ΄ΠΈΠΎ-ΠΏΠ»Π°Ρ‚Ρƒ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π·Π²ΡƒΠΊ; Π½ΠΎ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Ρ†Π΅ΠΏΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹: ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ, Π³ΠΎΠ΄ записи, альбом, Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ ΠΏΡ€. Π‘Π°ΠΌΠΈ ΠΏΠΎ сСбС эти Π΄Π°Π½Π½Ρ‹Π΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π° воспроизводимый Π·Π²ΡƒΠΊ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚, Π½ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сторонний ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡ… ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.
Π’ΠΎ ΠΆΠ΅ самоС с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ: ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ сторонним классам ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ вашСм Ρ‚ΠΈΠΏΠ΅. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш Ρ‚ΠΈΠΏ Ρ…ΠΎΡ€ΠΎΡˆΠΎ «Π΄Ρ€ΡƒΠΆΠΈΠ»» с Ρ‚Π°ΠΊΠΈΠΌΠΈ классами, Π²Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚Π΅ свой Ρ‚ΠΈΠΏ ΠΈ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΌΠΈ этот сторонний класс Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ.
ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ XML-сСриализация Ρ‡Π΅Ρ€Π΅Π· класс XmlSerializer. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΊΡƒΡ‡Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот класс Π·Π½Π°Π΅Ρ‚ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляры вашСго класса.
Если Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свои ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ΄ Windows Forms, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Π° Ρ„ΠΎΡ€ΠΌ Π² студии: ΠΊ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ относится ваш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ»ΠΈ Π΅Π³ΠΎ свойства, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π΅Π³ΠΎ измСнСния Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Π΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΈ свойство Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Π΅ ΠΈ Ρ‚.Π΄.
Π•ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для компилятора, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Conditional. Если компилятор ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π° вашСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, Ρ‚ΠΎ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ сгСнСрированы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ символ.

Никто, разумССтся, Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² своСм ΠΆΠ΅ ΠΊΠΎΠ΄Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ [STAThread]?

Π― ΠΈΠ·ΡƒΡ‡Π°ΡŽ C# 3.5 ΠΈ я Ρ…ΠΎΡ‡Ρƒ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ [STAThread] Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…?

3 ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²:

Π½Π° STAThreadAttribute ΠΏΠΎ сущСству, это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ насосу сообщСний Windows для связи с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ COM. Π₯отя ядро Windows Forms Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ COM, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ОБ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ систСмныС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ.

MSDN ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

STAThreadAttribute ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ МодСль com продСвая Π½ΠΈΡ‚ΠΊΡƒ для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π°. Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ присутствуСт Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° любого ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Windows Forms; Ссли ΠΎΠ½ ΠΎΠΏΡƒΡ‰Π΅Π½, Ρ‚ΠΎ ΠΎΠΊΠ½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ отсутствуСт, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ модСль ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ поддСрТиваСтся для Windows Forms.

этот Π±Π»ΠΎΠ³ (ΠΏΠΎΡ‡Π΅ΠΌΡƒ STAThread трСбуСтся?) Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ потоковая модСль Π² Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ CLR, см. эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΆΡƒΡ€Π½Π°Π»Π° MSDN с июня 2004 Π³ΠΎΠ΄Π° (Архив, АпрСля. 2009).

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ здСсь (Архивировано, Июнь 2009)

Он сообщаСт компилятору, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρ‹. Π­Ρ‚ΠΎ злая Π²Π΅Ρ‰ΡŒ COM, ΠΎΠ½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Windows Forms (GUI), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Win32 для своСго рисования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ STA. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ являСтся модСлью STA ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π° Gui ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (Ссли Π²Ρ‹ сдСлали ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ кодирования).

Π² основном, Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ ΠΎΠ± этом, просто ΠΏΡ€ΠΈΠΌΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠŸΠΎΡ‚ΠΎΠΊΠΈ графичСского интСрфСйса Windows Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ STA, ΠΈΠ½Π°Ρ‡Π΅ происходят странныС Π²Π΅Ρ‰ΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² C#


Π§Π°ΡΡ‚ΡŒ 2


Автор: Joseph Albahari
ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄: АлСксСй ΠšΠΈΡ€ΡŽΡˆΠΊΠΈΠ½
The RSDN Group
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ: Threading in C#
базируСтся Π½Π° ΠΊΠ½ΠΈΠ³Π΅
Joseph Albahari Ben Albahari «C# 3.0 in a Nutshell»
ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» прСдоставил: RSDN Magazine #2-2007

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ: 27.06.2007
Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ: 15.04.2009
ВСрсия тСкста: 1.0

Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Stathread c Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Stathread c Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это

3. Π Π°Π±ΠΎΡ‚Π° с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ


АпартамСнты ΠΈ Windows Forms

АпартамСнт – логичСский β€œΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€β€ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². АпартамСнты Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ² – β€œsingle” (ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅) ΠΈ β€œmulti” (ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅). ΠžΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ – любоС количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠžΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Π°Ρ модСль ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π°Ρ‰Π΅ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ большиС возмоТности для взаимодСйствия.

Π’ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚Π΅ сСбС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π³Π΄Π΅ каТдая ΠΊΠ½ΠΈΠ³Π° прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ нСльзя, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΌ всю Тизнь. Π”ΠΎΠ±Π°Π²ΠΈΠΌ сюда Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΏΠΎΡ‚ΠΎΠΊ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°-контСкст синхронизации ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²ΠΎΠΉΡ‚ΠΈ Π»ΡŽΠ±ΠΎΠΌΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Если людСй большС – ΠΏΠ΅Ρ€Π΅Π΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ образуСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°-Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ свой ΡˆΡ‚Π°Ρ‚ – ΠΎΠ΄Π½ΠΎΠ³ΠΎ библиотСкаря для ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ. Никто, ΠΊΡ€ΠΎΠΌΠ΅ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€Π΅ΠΉ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠΉΡ‚ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. ΠšΠ»ΠΈΠ΅Π½Ρ‚, ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ провСсти исслСдованиС, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠΈΠ³Π½Π°Π»ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ€ΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Π½ΠΈΠ΅! Π’Ρ‹Π·ΠΎΠ² библиотСкаря называСтся ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ΠΎΠΌ – ΠΊΠ»ΠΈΠ΅Π½Ρ‚ выполняСт ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ своСго Π²Ρ‹Π·ΠΎΠ²Π° ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΌΡƒ сотруднику. ΠœΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³ выполняСтся автоматичСски ΠΈ рСализуСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠΊΠ°Ρ‡ΠΊΡƒ сообщСний – Π² Windows Forms этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ постоянно слСдит Π·Π° событиями ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΡ‹ΡˆΠΈ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ успСваСт Π·Π° Π½ΠΎΠ²Ρ‹ΠΌΠΈ сообщСниями, создаСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний, обрабатываСмая Π² порядкС поступлСния.

НазначСниС Ρ‚ΠΈΠΏΠ° Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚Π°

МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ прилоТСния вошСл Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π°ΠΏΠ°Ρ€Ρ‚Π°ΠΌΠ΅Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ STAThread для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° main :

Control.Invoke


BackgroundWorker

BackgroundWorker – класс-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° ΠΈΠ· пространства ΠΈΠΌΠ΅Π½ System.ComponentModel для управлСния Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Он обСспСчиваСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности:

ПослСдниС Π΄Π²Π΅ возмоТности особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ – ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ try/catch Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ элСмСнты управлСния Π±Π΅Π· использования Control.Invoke.

BackgroundWorker ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡƒΠ» ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΠ²ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ нСльзя Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Abort для ΠΏΠΎΡ‚ΠΎΠΊΠ° BackgroundWorker.

Π’ΠΎΡ‚ минимально Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия для использования BackgroundWorker :

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Код Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ProgressChanged ΠΌΠΎΠΆΠ΅Ρ‚ свободно ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ элСмСнтам управлСния UI Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² RunWorkerCompleted. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π½ΡƒΠΆΠ½ΠΎ для обновлСния ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° прогрСсса.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Π΅ описанныС возмоТности:

ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (Enter Π½Π°ΠΆΠ°Ρ‚ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ BackgroundWorker):

ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (Ρ€Π°Π±ΠΎΡ‚Π° BackgroundWorker Π½Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π»Π°ΡΡŒ):

НаслСдованиС ΠΎΡ‚ BackgroundWorker

МоТно Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования BackgroundWorker Ρ…ΠΎΡ€ΠΎΠ½ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ β€œΠ°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ модСль, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° событиях”.

ReaderWriterLock

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ экзСмпляры Ρ‚ΠΈΠΏΠΎΠ² потокобСзопасны ΠΏΡ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… опСрациях чтСния, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… обновлСниях, ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ. Π’ΠΎ ΠΆΠ΅ самоС справСдливо для рСсурсов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ². Если Π² основном выполняСтся Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° – запись, Π·Π°Ρ‰ΠΈΡ‚Π° экзСмпляров Ρ‚Π°ΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² простой эксклюзивной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ для всСх Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² доступа ΠΌΠΎΠΆΠ΅Ρ‚ нСобоснованно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ привСсти сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² статичСских полях для быстрого доступа. Класс ReaderWriterLock Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠΉ сцСнарий Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΡ‚Π°Ρ€Ρ‚ΡƒΡŽΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° – ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ добавляСт элСмСнты Π² список, Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΡ… удаляСт, Π° Π΄Π²Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ постоянно ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΎ количСствС элСмСнтов Π² спискС. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° запись, Π΄Π²Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ Π² 10 сСкунд (ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠΏΡƒΡ‰Π΅Π½Π° для краткости).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов Π² список происходит быстрСС, Ρ‡Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅, Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ AppendItem Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‹Π·ΠΎΠ² SpinWait для сохранСния баланса.

ΠŸΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Для использования ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ WaitHandle ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ исполнСн, ΠΊΠΎΠ³Π΄Π° WaitHandle Π±ΡƒΠ΄Π΅Ρ‚ установлСн. Π­Ρ‚ΠΎ дСлаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ThreadPool.RegisterWaitForSingleObject, ΠΊΠ°ΠΊ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (послС пятисСкундной Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ):

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ WaitHandle ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρƒ RegisterWaitForSingleObject ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-β€œΡ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² ваш Π΄Π΅Π»Π΅Π³Π°Ρ‚ (ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ для ParameterizedThreadStart ), Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ Π² миллисСкундах (-1, Ссли Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ Π½Π΅ Π½ΡƒΠΆΠ΅Π½) ΠΈ Ρ„Π»Π°Π³, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, являСтся запрос ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΡΡ.

Π’Ρ‹Π·ΠΎΠ² Abort для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡƒΠ»Π° – это Ρ‚ΠΎΠΆΠ΅ плохая идСя. ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡƒΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ всСй ΠΆΠΈΠ·Π½ΠΈ прилоТСния.

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ свойствами, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. НапримСр, Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ Go Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Π²Π° цСлочислСнных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π² ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² – Ρ‡Π΅Ρ€Π΅Π· асинхронныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹.

АсинхронныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части Π±Ρ‹Π»ΠΎ описано, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ParameterizedThreadStart. Иногда ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. АсинхронныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ для этого ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, позволяя ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях любоС количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΈΡ… Ρ‚ΠΈΠΏΠ°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· асинхронных Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² исходный ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. АсинхронныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΡƒΠ»Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π¦Π΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ – асинхронная модСль. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, сначала рассмотрим ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ, ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ модСль программирования. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Π½ΡƒΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π΅ web-страницы. МоТно ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ страницу, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ асинхронныС Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π²ΡƒΡ… web-страниц, с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… вычислСний:

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с объявлСния ΠΈ создания Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ асинхронно. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Π²Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° – ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° WebClient ( WebClient Π½Π΅ допускаСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ доступа, Ссли Π±Ρ‹ это Π±Ρ‹Π»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ использовали Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ СдинствСнный Π΄Π΅Π»Π΅Π³Π°Ρ‚).

АсинхронныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Π‘Ρ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ асинхронных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ссли Π²Ρ‹ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ спСциализированноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов, ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

Если Π²Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ NetworkStream.Read ) Ρ‡Π΅Ρ€Π΅Π· асинхронный Π΄Π΅Π»Π΅Π³Π°Ρ‚. Другая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ThreadPool.QueueUserWorkItem ΠΈΠ»ΠΈ BackgroundWorker β€” Π»ΠΈΠ±ΠΎ просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

АсинхронныС события


Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹

Π’Π°ΠΉΠΌΠ΅Ρ€ Windows Forms ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ обновлСнию ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ достаточно быстро. Быстрота выполнСния Π²Π°ΠΆΠ½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ событиС Tick вызываСтся Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Π²ΠΎ врСмя Π΅Π³ΠΎ выполнСния интСрфСйс Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΎΡ‚ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для хранСния спСцифичСских Π΄Π°Π½Π½Ρ‹Ρ… инфраструктуры выполнСния, Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² бСзопасности. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±Ρ‹Π»ΠΎ Π±Ρ‹ слишком Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² статичСских полях ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π΅Π΅ для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ΠœΠ΅Ρ‚ΠΎΠ΄ Thread.GetData Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ области Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, Thread.SetData ΠΏΠΈΡˆΠ΅Ρ‚ Π² Π½Π΅Π΅. Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ LocalDataStoreSlot (Π½Π° самом Π΄Π΅Π»Π΅ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для строки с ΠΈΠΌΠ΅Π½Π΅ΠΌ слота) для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ слота. Один ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ LocalDataStoreSlot ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΈΠ· любого ΠΏΠΎΡ‚ΠΎΠΊΠ° для получСния ΠΈΠΌ своих Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

4. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹


ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π°Ρ синхронизация


ΠΡ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΈ Interlocked

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ, Ссли ΠΎΠ½Π° выполняСтся ΠΊΠ°ΠΊ Сдиная, нСдСлимая ΠΊΠΎΠΌΠ°Π½Π΄Π°. Бтрогая Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ прСпятствуСт любой ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ вытСснСния. Π’ C# простоС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ присвоСниС значСния полю Π² 32 Π±ΠΈΡ‚Π° ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ (для 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… CPU). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с большими полями Π½Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния/записи:

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись 64-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π½Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ Π½Π° 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… CPU, Ρ‚Π°ΠΊ ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… участка памяти. Если ΠΏΠΎΡ‚ΠΎΠΊ A Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ B обновляСт Π΅Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΊ A ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΈΠ· старого ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π£Π½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚ΠΈΠΏΠ° x++ сначала Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π΅Π΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс:

Один ΠΈΠ· ΠΏΡƒΡ‚Π΅ΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ – ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π΅Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° фактичСски ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ. Однако класс Interlocked ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ простоС ΠΈ быстроС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для простых Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

Π‘Π°Ρ€ΡŒΠ΅Ρ€Ρ‹ Π² памяти ΠΈ асинхронная ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ (volatility)

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс:

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, вопрос: насколько сущСствСнная Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ «ΠŸΠΎΠ½Π΅ΡΠ»Π°ΡΡŒ. » ΠΎΡ‚ «Π“ΠΎΡ‚ΠΎΠ²ΠΎ» – Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Ρ†ΠΈΠΊΠ» Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Wait ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΡΡ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ„Π»Π°Π³ endIsNigh Π±Ρ‹Π» установлСн Π² true? И Π΅Ρ‰Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Wait Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ «Π“ΠΎΡ‚ΠΎΠ²ΠΎ, false»?

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° ΠΎΠ±Π° вопроса – тСорСтичСски Π΄Π°, ΠΌΠΎΠΆΠ΅Ρ‚, Π½Π° многопроцСссорной машинС, Ссли ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ эти Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ CPU. Поля repented ΠΈ endIsNigh ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² рСгистрах CPU для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π°Π·Π°Π΄ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. И порядок, Π² ΠΊΠ°ΠΊΠΎΠΌ рСгистры Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ совпадСт с порядком обновлСния ΠΏΠΎΠ»Π΅ΠΉ.

Π­Ρ‚ΠΎ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Thread.VolatileRead ΠΈ Thread.VolatileWrite для чтСния ΠΈ записи ΠΏΠΎΠ»Π΅ΠΉ. VolatileRead – это способ β€œΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ послСднСС значСниС”; VolatileWrite ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ β€œΠ·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒβ€. Π’ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π±ΠΎΠ»Π΅Π΅ изящно, объявлСниСм ΠΏΠΎΠ»Π΅ΠΉ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ volatile :

ИспользованиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ссли Π±Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ полям repented ΠΈ endIsNigh Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ:

Wait ΠΈ Pulse

Π Π°Π½Π΅Π΅ ΠΌΡ‹ рассматривали EventWaitHandle – простой ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄ΠΎ получСния увСдомлСния ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Wait ΠΈ Pulse – скудная докумСнтация, особСнно Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ нСобходимости ΠΈΡ… примСнСния. И Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Wait ΠΈ Pulse ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°ΡŽΡ‚ особСнноС ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π΄ΠΈΠ»Π΅Ρ‚Π°Π½Ρ‚Π°ΠΌ: Ссли Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΈΡ… Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ понимания, ΠΎΠ½ΠΈ это ΡƒΠ·Π½Π°ΡŽΡ‚ – ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ счастливы Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π·Π°ΠΌΡƒΡ‡Π°Ρ‚ΡŒ вас Π΄ΠΎ смСрти! К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π΅ΡΡ‚ΡŒ простой ΠΎΠ±Ρ€Π°Π·Π΅Ρ†, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ случаС.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Wait ΠΈ Pulse

НазначСниС Wait ΠΈ Pulse – ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ простой ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ: Wait Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Pulse Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ это ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅.

НапримСр, Ссли x объявлСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° Π²Ρ‹Π·ΠΎΠ²Π΅ Monitor.Wait :

А этот ΠΊΠΎΠ΄ (Ссли ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠΎΠ·ΠΆΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅) освободит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ:

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ, Monitor.Wait Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ освобоТдаСт ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ lock Π½Π° врСмя оТидания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Pulse ) Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠœΠ΅Ρ‚ΠΎΠ΄ Wait ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ псСвдокода:

Wait логичСски разворачиваСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Богласно Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ сСмантикС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Monitor.Enter Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ произвСсти Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

Бигнализация ΠΈ подтвСрТдСния

ВаТная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Monitor.Pulse – этот Π²Ρ‹Π·ΠΎΠ² выполняСтся асинхронно, Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ. Если Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΆΠ΄Π΅Ρ‚ Π½Π° сигнальном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Ссли Π½Π΅Ρ‚, Π²Ρ‹Π·ΠΎΠ² Pulse Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΡ…ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

Pulse обСспСчиваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Никакого встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ Π½Π΅ сущСствуСт. Pulse Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ, Π±Ρ‹Π» Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΡˆΠ»Π΅Ρ‚ сигнал ΠΈ освободит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΆΠ΄ΡƒΡ‰ΠΈΠΉ сигнала ΠΏΠΎΡ‚ΠΎΠΊ вСрнСтся ΠΊ ΠΆΠΈΠ·Π½ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Π°Ρ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°, опрСдСляСмая ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ затрудняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ возобновляСт исполнСниС, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ прСдусмотрСно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ подтвСрТдСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π²ΠΈΠ΄Π΅ Ρ„Π»Π°Π³Π°.

Полагаясь Π½Π° своСврСмСнныС дСйствия ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ сигнала, Π±Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ Π²Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅!

ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ оТидания ΠΈ PulseAll

Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ Wait Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΌΠΎΠ³ΡƒΡ‚ сразу нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² – Π² этом случаС Π·Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ синхронизации образуСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ оТидания, «waiting queue» (Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ c ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ оТидания Π½Π° lock – «ready queue»). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Pulse освобоТдаСт ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Π³ΠΎΠ»ΠΎΠ²Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ оТидания, «waiting queue», послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ «ready queue» для пСрСустановки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. МоТно провСсти аналогию с автоматичСской ΠΏΠ°Ρ€ΠΊΠΎΠ²ΠΊΠΎΠΉ для машин – сначала Π²Ρ‹ стоитС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΊ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρƒ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² («waiting queue»), Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΆΠ΄Π΅Ρ‚Π΅ снова ΠΏΠ΅Ρ€Π΅Π΄ ΡˆΠ»Π°Π³Π±Π°ΡƒΠΌΠΎΠΌ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ («ready queue»).

Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Stathread c Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Stathread c Ρ‡Ρ‚ΠΎ это
Рисунок 2: Waiting Queue ΠΈ Ready Queue

ИспользованиС Pulse и Wait

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ. И для Π½Π°Ρ‡Π°Π»Π° условимся ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

ИмСя Π² Π²ΠΈΠ΄Ρƒ эти Π΄Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°, рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ приостанавливаСтся, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°:

Π’ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Main, приводящий всС это Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запустим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚:

Π’ΠΎΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс, с ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ для краткости Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Console :

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ использования Wait ΠΈ Pulse

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вставим Π² наш шаблон Wait ΠΈ Pulse Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π·:

Π’ΠΎΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ псСвдокод:

Π’Π°ΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Pulse Π½Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊ возобновлСнию исполнСния. Π‘ΠΊΠΎΡ€Π΅Π΅ Pulse Ρ‚ΠΎΠ»ΡŒΠΊΠΎ увСдомляСт Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ измСнилось, рСкомСндуя ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ условиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. НС ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ, Π° сам ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ опрСдСляСт (Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°), Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° – Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования слоТных условий Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±Π΅Π· замысловатой Π»ΠΎΠ³ΠΈΠΊΠΈ синхронизации.

ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ поставщик/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для прСдставлСния Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ строка. А ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π΄Π°Ρ‡ Π±ΡƒΠ΄Π΅Ρ‚, соотвСтствСнно, Ρ‚Π°ΠΊΠΎΠΉ:

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² lock всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π’Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ постановка Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ:

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг – Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ удаляСт Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ исполняСт Π΅Ρ‘:

Π’ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ являСтся потокобСзопасным: Π²ΠΎ врСмя удалСния Π·Π°Π΄Π°Ρ‡ΠΈ информация ΠΎ состоянии ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΆΠ΅ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ lock. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ получится, Ссли Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°-потрСбитСля с ΠΎΠ΄Π½ΠΈΠΌ-СдинствСнным элСмСнтом Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ вошСл Π±Ρ‹ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π² Ρ†ΠΈΠΊΠ»Π΅ – ΠΎΠ±Π° ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π±Ρ‹ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΠ΄ΠΈΠ½ элСмСнт. Π”Π°Π»Π΅Π΅ ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Π±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ этот элСмСнт, с Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ. Для исправлСния ситуации Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ lock Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ дольшС – Π΄ΠΎ окончания взаимодСйствия с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ:

(НСт нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Pulse послС удалСния ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ элСмСнтами Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ).

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π°Ρ‡Π° ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. БнятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² этом мСстС позволяСт ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π±Π΅Π· Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ блокирования Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π’ соотвСтствии с нашим шаблоном проСктирования, Ссли ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ PulseAll ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Wait Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΡ€ΠΎ экономию сигналов

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π΅Ρ‰Π΅ Ρ€Π°Π· Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ:

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° Π²Ρ‹Π΄Π°Ρ‡Π΅ сигналов, сигналя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ исполнитСля:

Бэкономим ΠΌΡ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Π΄Π°Ρ‡Π° сигнала Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ микросСкунды ΠΈ Π½Π΅ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов для занятых ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ этот сигнал всС Ρ€Π°Π²Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ любой Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ: ΠΏΠ»ΠΎΡ…ΠΎ воспроизводимый Π΄Π΅Ρ„Π΅ΠΊΡ‚ ΠΈΠ·-Π·Π° Π³Π»ΡƒΠΏΠΎΠΉ ошибки – слишком большая Ρ†Π΅Π½Π° Π·Π° экономию ΠΎΠ΄Π½ΠΎΠΉ микросСкунды! Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ внСсСния Π±Π»ΡƒΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ ошибки Ρ‚ΠΈΠΏΠ° β€œΠ·Π°ΡΡ‚Ρ€ΡΠ²ΡˆΠΈΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒβ€, которая навСрняка Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ выявлСна ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ тСстировании (Π½Π°ΠΉΠ΄ΠΈ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅):

Бигнализация Π±Π΅Π· всяких условий Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ вас ΠΎΡ‚ этого Ρ‚ΠΈΠΏΠ° ошибок.

Π‘ΠžΠ’Π•Π’

БомнСваСшься – сигналь! Π’ рассмотрСнном шаблонС проСктирования сигнализация Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ.

Pulse ΠΈΠ»ΠΈ PulseAll?

Вспомним ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅: ΠΏΡ€ΠΈ использовании Pulse ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±ΡƒΠ΄ΠΈΡ‚ΡŒΡΡ максимум ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ условиС блокирования Π² while ); Π² случаС PulseAll пробудятся всС ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (ΠΈ пСрСпровСрят условиС блокирования). Если Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ добавляСтся ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°, для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Pulse. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° класс спящих Π΄Π΅Ρ‚Π΅ΠΉ – Ссли Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½ΠΎΠ΅, Π½Π΅Ρ‚ смысла Π±ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΈΡ… всСх ΠΈ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Π¦Π΅Π½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ Pulse – Π·Π°ΡΡ‚Ρ€ΡΠ²ΡˆΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. Π­Ρ‚Π° ошибка Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΡƒΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² Pulse ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ эффСкт, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ находится Π² состоянии оТидания. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ наш ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π»ΠΎΠ·ΡƒΠ½Π³ β€œΠ‘ΠΎΠΌΠ½Π΅Π²Π°Π΅ΡˆΡŒΡΡ – ΡΠΈΠ³Π½Π°Π»ΡŒβ€ Π΄ΠΎ β€œΠ‘ΠΎΠΌΠ½Π΅Π²Π°Π΅ΡˆΡŒΡΡ – сигналь всСм!”

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° вычислСниС условия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ИспользованиС Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² для Wait

Иногда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Pulse всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° измСняСтся условиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ условиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄, пСриодичСски Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Если врСмя оТидания – Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ простоС: ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Wait ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

УсловиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ рСгулярно с ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π² Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала. Π§Π΅ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ условиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Ρ‚Π΅ΠΌ мСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· сниТСния эффСктивности.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли сигнал Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ ΠΈΠ·-Π·Π° ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅! Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, стоит Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΊΠΎ всСм ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ Wait Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Π³Π΄Π΅ синхронизация особСнно слоТна – Π² качСствС страховки ΠΎΡ‚ особо Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… ошибок сигнализации. Π’Π°ΠΊΠΆΠ΅ это обСспСчиваСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ ошибкам, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСняСтся ΠΏΠΎΠ·ΠΆΠ΅ ΠΊΠ΅ΠΌ-Ρ‚ΠΎ нСсвСдущим.

Π“ΠΎΠ½ΠΊΠΈ ΠΈ подтвСрТдСния

Допустим, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΡΠΈΠ³Π½Π°Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΏΡΡ‚ΡŒ Ρ€Π°Π· подряд:

ΠŸΡ€ΠΈ тСстировании этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Β«ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Β», запуская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π² debug-Ρ€Π΅ΠΆΠΈΠΌΠ΅ (Π½Π΅ ΠΈΠ· ΠΏΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°), ΠΈ Β«Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Β» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, зависаниС) Π² release-вСрсии – ΠΏΡ€ΠΈΠΌ.Ρ€Π΅Π΄.

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΎΠΌ: Ρ†ΠΈΠΊΠ» for Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ всС ΠΏΡΡ‚ΡŒ своих ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² Ρ‚ΠΎ врСмя, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΎΠΎΠ±Ρ‰Π΅ стартуСт! Наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ ΠŸΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊ/ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ страдал ΠΎΡ‚ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ссли Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π±Π΅Π³Π°Π» Π²ΠΏΠ΅Ρ€Ρ‘Π΄ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос просто ставился Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Но Π² Π΄Π°Π½Π½ΠΎΠΌ случаС трСбуСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, Ссли Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ всС Π΅Ρ‰Π΅ занят ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

Π’ качСствС простого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° for ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Ρ„Π»Π°Π³ go Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ послС сброса Ρ„Π»Π°Π³Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Pulse :

ВаТная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ освобоТдаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ задания (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π° мСстС Π²Ρ‹Π·ΠΎΠ²Π° Console.WriteLine ). Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ всС врСмя, ΠΏΠΎΠΊΠ° Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ исполняСт Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΠΌΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ посигналили (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ занят ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ).

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ (Π³Π»Π°Π²Π½Ρ‹ΠΉ) сигналит Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎ нСобходимости Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ. Если нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π°Ρ‡Π½ΡƒΡ‚ ΡΠΈΠ³Π½Π°Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main – Ρƒ нас начнутся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π”Π²Π° сигналящих ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°:

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ запустим Π΄Π²Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… посигналит Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·. Π’Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ дСсяти ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ:

Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ Wait Handle

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: ΠΎΠ±Π° Ρ†ΠΈΠΊΠ»Π° оТидания ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с нСсколькими WaitHandle, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв проста. Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° WaitAll с нСсколькими WaitHandle – Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ условиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ всС Ρ„Π»Π°Π³ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ вмСсто WaitHandle :

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ WaitAll Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π½Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½ ΠΊ использованию ΠΈΠ·-Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с унаслСдованным COM-ΠΊΠΎΠ΄ΠΎΠΌ. Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ WaitAny – просто вопрос Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° && ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ||.

Wait ΠΈ Pulse vs. Wait Handles

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этому с WaitHandle ΠΏΡ€ΠΎΡ‰Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ – ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π’ ΠΏΡƒΠ»Π°Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² это свойство с пользой примСняСтся.

Π’ смыслС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Wait ΠΈ Pulse ΠΈΠΌΠ΅ΡŽΡ‚ нСбольшой пСрСвСс, Ссли ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ Π΄ΠΈΠ·Π°ΠΉΠ½Π°:

Suspend ΠΈ Resume

МоТно, ΠΎΠ΄Π½Π°ΠΊΠΎ, бСзопасно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Suspend для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΏΡ€ΠΈ этом простой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации для Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ†ΠΈΠΊΠ»Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ/Π²Ρ‹Π·ΠΎΠ² Suspend для сСбя/ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° Resume (β€œΠΏΠΎΠ±ΡƒΠ΄ΠΊΠΈβ€) Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Ρ‡Π°. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ сСйчас приостановлСн. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

НСрСкомСндуСмыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Suspend ΠΈ Resume ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° – опасный ΠΈ бСсполСзный.

АварийноС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Abort :

НСобработанноС ThreadAbortException, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ прилоТСния, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Abort Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊ Π² любом состоянии – Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ, приостановлСнном ΠΈΠ»ΠΈ остановлСнном. Если, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ приостановлСнный ΠΏΠΎΡ‚ΠΎΠΊ, гСнСрируСтся ThreadStateException – Π½Π° сСй Ρ€Π°Π· Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ – ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ приостановлСный ΠΏΠΎΡ‚ΠΎΠΊ:

БлоТности с Thread.Abort

C#-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ using – Π½Π° самом Π΄Π΅Π»Π΅ просто сокращСнная запись для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°:

Π’ этом случаС Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Dispose Π² Π±Π»ΠΎΠΊΠ΅ finally Π΄Π΅Π»ΠΎ Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚, хэндл ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° зависнСт, прСсСкая Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ myfile.txt Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ ΠΆΠΈΠ·Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ дизассСмблированиС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° CLR, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π½Π΅ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ, встаСт вопрос, ΠΊΠ°ΠΊ ΠΆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ. Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ситуации – Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π±ΡƒΠ»Π΅Π²ΠΎ ΠΏΠΎΠ»Π΅, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎ нСобходимости Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ пСриодичСски ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ это ΠΏΠΎΠ»Π΅, элСгантно Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡΡΡŒ, Ссли ΠΎΠ½ΠΎ установлСно Π² true. Как Π½ΠΈ странно, самым элСгантным Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Abort для сСбя самого, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ явный выброс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ очистку ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² процСссС выполнСния Π±Π»ΠΎΠΊΠΎΠ² catch/finally – Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρƒ Abort ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ гСнСрируСтся Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ Π½Π°ΠΌΠΈ мСстС:

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ бСзопасно ΠΏΡ€ΠΈΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ – Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² собствСнном Π΄ΠΎΠΌΠ΅Π½Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Abort просто сносится вСсь Π΄ΠΎΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ освобоТдСнию всСх Π·Π°Π²ΠΈΡΡˆΠΈΡ… рСсурсов.

А Π²ΠΎΡ‚ модифицированная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ исполняСтся Π² собствСнном Π΄ΠΎΠΌΠ΅Π½Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выгруТаСтся послС ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Она бСсконСчно выполняСтся Π±Π΅Π· ошибок, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎΠΌΠ΅Π½ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°ΡΡΡŒ, освобоТдаСт Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ хэндл:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ классифицируСтся Π² ΠΌΠΈΡ€Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊΠ°ΠΊ опСрация, ΠΎΡ‚Π½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (нСсколько миллисСкунд), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π½Π΅ стоит Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² Ρ†ΠΈΠΊΠ»Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅, привносимоС Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, добавляСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, ΠΈ Π²Ρ€Π΅Π΄Π½Ρ‹ΠΌ, Π² зависимости ΠΎΡ‚ назначСния ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ контСкстС unit-тСстирования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, исполнСниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСссов

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ – Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ – Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ с установлСнным Π² true свойством IsBackground, ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Π΅Ρ‰Π΅ исполняСтся. Π€ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ способСн ΠΏΡ€ΠΎΠ΄Π»ΠΈΡ‚ΡŒ Тизнь прилоТСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, унося с собой Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Когда ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠ·-Π·Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса, ΠΎΠ½ останавливаСтся Π½Π°ΠΌΠ΅Ρ€Ρ‚Π²ΠΎ, Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ finally Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *