Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 119

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

// ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-нСзависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ загруТаСтся Π² контСкст 0.

public class SportsCar()

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

Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ нСобходимости получСния Ρ‚ΠΈΠΏΠ° ΠΈΠ· System.ContextBoundObject, контСкстно-связанный Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π΄Π΅Π»Π΅Π½ рядом ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² .NET, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… контСкстными Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ (Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ). ВсС контСкстныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. System.Runtime.Remoting.Contexts. ContextAttribute:

public class System.Runtime.Remoting.Contexts.ContextAttribute: Attribute, IContextAttribute, IContextProperty {

 public ContextAttribute(string name);

 public string Name { virtual get; }

 public object TypeId { virtual get; }

 public virtual bool Equals(object o);

 public virtual void Freeze(System.Runtime.Remoting.Contexts.Context newContext);

 public virtual int GetHashCode();

 public virtual void GetPropertiesForNewContext(System.Runtime.Remoting.Activation.IConstructionCallMessage сtorMsg);

 public Type GetType();

 public virtual bool IsContextOK(System.Runtime.Remoting.Contexts.Context ctx, System.Runtime.Remoting.Activation.IConstructionCallMessage ctorMsg);

 public virtual bool IsDefaultAttribute();

 public virtual bool IsNewContextOK(System.Runtime.Remoting.Contexts.Context newCtx);

 public virtual bool Match(object obj);

 public virtual string ToString();

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс ContextAttribute Π½Π΅ являСтся ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свои собствСнныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ контСкстныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (для этого слСдуСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ ContextAttribute, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹). ПослС этого Π²Ρ‹ смоТСтС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π½Π° контСкстныС установки.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’ этой ΠΊΠ½ΠΈΠ³Π΅ Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ подробности создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… контСкстов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ Ссли Π²Ρ‹ заинтСрСсованы ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± этом большС, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³Ρƒ Applied .NET Attributes (Apress, 2003).

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ контСкстно-связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ класс (SportsCarTS), автоматичСски ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, Π±Π΅Π· добавлСния Π² Π½Π΅Π³ΠΎ слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ синхронизации ΠΏΠ°Ρ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π»Π΅Π½ΠΎΠ², слСдуСт Π²Π·ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ ContextBoundObject, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [Synchronization], ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

using System.Runtime.Remoting.Contexts;

// Π­Ρ‚ΠΎΡ‚ контСкстно-связанный Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

// Π² синхронизированном (Ρ‚.Π΅. ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ) контСкстС.

[Synсhronization]

public class SportsCarTS: ContextBoundObject{}

Π’ΠΈΠΏΡ‹ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ [Synchronization] Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² контСкстС сохранСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° класса MyThreadSafeObject ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ пСрСвСсти ΠΈΠ· синхронизированного контСкста Π² нСсинхронизированный. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π²Π΄Ρ€ΡƒΠ³ пСрСстанСт Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ прСвратится Π² ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»Ρ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с этим ссылочным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΆΠ΅ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ). Для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ срСда CLR Π½Π΅ пСрСмСстит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ SportsCarTS Π·Π° Ρ€Π°ΠΌΠΊΠΈ синхронизированного контСкста, достаточно Π²Π·ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ ContextBoundObject.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° контСкста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Из Ρ‚Π΅Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ построитС сами, ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ взаимодСйствия с контСкстом, Π½ΠΎ Π²ΠΎΡ‚ Π²Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ContextManipulator. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ контСкстно-нСзависимый класс (SportsCar) ΠΈ ΠΎΠ΄ΠΈΠ½ контСкстно-связанный (SportsCarTS).

using System.Runtime.Remoting.Contexts; // Для Ρ‚ΠΈΠΏΠ° Context.

using System.Threading; // Для Ρ‚ΠΈΠΏΠ° Thread.

// Π’ΠΈΠΏ SportsCar Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… контСкстных Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ

// ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… контСкста, создаваСмого Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ

// прилоТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

public class SportsCar {

 public SportsCar() {

  // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° контСкста.

  Context ctx = Thread.CurrentContext;

  Console.WriteLine("{0} ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² контСкстС {1}", this.ToString(), ctx.ContextID);

  foreach (IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-β€Ί Бвойство контСкста: {0}", itfCtxProp.Name);

 }

}

// Π’ΠΈΠΏ SportsCarTS Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

// Π² синхронизированном контСкстС.

[Synchronization]

public class SportsCarTS: ContextBoundObject {

 public SportsCarTS() {

  // Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° контСкста.

  Context ctx = Thread.CurrentContext;

  Console.WriteLine("{0} ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² контСкстС {1}", this.ToString(), ctx.ContextID);

  foreach(IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-β€Ί Бвойство контСкста: {0}", itfCtxProp.Name);

 }

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ. Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ конструктор ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Context ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния Ρ‡Π΅Ρ€Π΅Π· статичСскоС свойство Thread.CurrentContext. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Context, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ… контСкста, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ID контСкста ΠΈΠ»ΠΈ значСния дСскрипторов, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Context.ContextProperties. Π­Ρ‚ΠΎ свойство Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс IContextProperty, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт доступ ΠΊ дСскрипторам с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Name. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Main(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎ экзСмпляру ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² класса.

static void Main(string[] args) {

 Console.WriteLine("*** ЧудСсноС контСкстноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ***\n");

  // ΠŸΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ контСкста.

 SportsCar sport = new SportsCar();

 Console.WriteLine();

 SportsCar sport2 = new SportsCar();

 Console.WriteLine();

 SportsCarTS synchroSport = new SportsCarTS();

 Console.ReadLine();

}

По ΠΌΠ΅Ρ€Π΅ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² конструкторы классов ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ элСмСнты ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ контСкстС (рис. 13.10).

Рис. 13.10. ИсслСдованиС контСкста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Для класса SportsCar Π½Π΅ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ контСкста, поэтому срСда CLR Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ sport ΠΈ sport2 Π² контСкстС 0 (Ρ‚.Π΅. Π² контСкстС, созданном ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). Однако ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ SportsCarTS загруТаСтся Π² свои ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ назначаСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 1), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для этого контСкстно-связанного Ρ‚ΠΈΠΏΠ° Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ [Synchronization].

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ContextManipulator Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 13.

Π•Ρ‰Π΅ нСсколько слов ΠΎ процСссах, Π΄ΠΎΠΌΠ΅Π½Π°Ρ… прилоТСния ΠΈ контСкстах

К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ срСда CLR ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ .NET. Π’ΠΎΡ‚ Π½Π° Ρ‡Ρ‚ΠΎ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

β€’ ΠŸΡ€ΠΎΡ†Π΅ΡΡ .NET ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² прилоТСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ любоС число связанных ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² .NET ΠΈ нСзависимо Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ срСдой CLR (ΠΈΠ»ΠΈ программистом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° System.AppDomain).

β€’ Π›ΡŽΠ±ΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½ прилоТСния состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… контСкстов. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ контСксты, срСда CLR ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ со "ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ трСбованиями" Π² логичСский ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этих Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π² срСдС выполнСния.

Если ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ обсуТдСниС каТСтся Π²Π°ΠΌ слишком слоТным ΠΈ Π΄Π°Π»Π΅ΠΊΠΈΠΌ ΠΎΡ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ. По большСй части срСда выполнСния .NET автоматичСски Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ вопросы процСссов, Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ контСкстов, Π½Π΅ трСбуя вашСго Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ прСдставлСнная здСсь информация обСспСчиваСт "Ρ‚Π²Π΅Ρ€Π΄ΡƒΡŽ основу" для понимания ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ .NET. Но ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ пространства ΠΈΠΌΠ΅Π½ System.Threading, ΠΌΡ‹ попытаСмся Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ сама срСда CLR обрабатываСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой Win32.

Π₯остинг общСязыковой срСды выполнСния

Для ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ запуск выполняСмого Π±Π»ΠΎΠΊΠ° .NET доступСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Ρ‰Π΅Π»Ρ‡ΠΊΠ° Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ *.exe Π² ΠΎΠΊΠ½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠŸΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊ (ΠΈΠ»ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ярлыка). Но Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 1, Ρ‡Ρ‚ΠΎ каркас .NET Framework (ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ) Π½Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ нСпосрСдствСнно Π² ОБ Windows, Π° опираСтся Π½Π° ОБ. Π’ΠΎ врСмя установки Visual Studio 2005 (ΠΈΠ»ΠΈ .NET Framework 2.0 SDK) Π½Π° Π²Π°ΡˆΡƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ устанавливаСтся ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ срСды выполнСния .NET (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов). Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Microsoft ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ свободно Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ установки (dotnetfx.exe) срСды выполнСния .NET, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² .NET.