Можете ли вы получить доступ к полям экземпляра из обработчика событий RoleEnvironment.OnRoleChanging?
Я пытаюсь выяснить, как рабочие роли Azure инициируют события RoleEnvironment и как это влияет на доступ к полям.
Со ссылкой на мой пример кода ниже, я понимаю, что:
- Обработчики событий RoleEnvironmentChanging и RoleEnvironmentChanged будут выполняться в контексте потока, который инициирует события
- Поток событий будет отличаться от потока, блокируемого AutoResetEvent.
Означает ли это, что RoleEnvironmentChanged и OnStop не смогут ссылаться на поле экземпляра _someClass, придется ли мне делать его статическим? Или у обработчиков событий есть замыкание вокруг переменных экземпляра?
Вот упрощенный пример:
public abstract class WorkerRole : RoleEntryPoint
{
private readonly AutoResetEvent _eventHandler = new AutoResetEvent(false);
private SomeClass _someClass;
public override bool OnStart()
{
RoleEnvironment.Changing += RoleEnvironmentChanging;
RoleEnvironment.Changed += RoleEnvironmentChanged;
_someClass = new SomeClass();
return base.OnStart();
}
public override void OnStop()
{
// Tell the other class to stop
_someClass.Stop();
base.OnStop();
}
public override void Run()
{
// Start some process in another class that executes on a different thread internally.
_someClass.Run()
_eventHandler.WaitOne(); // Wait, so the method doesn't return and the role restart.
base.Run();
}
private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
e.Cancel = false // Never restart the role (just for this example)
}
void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
{
_SomeClass.Refresh() // Just proving I can call this variable from here.
}
}
1 ответ
Решение
Ваши 2 утверждения верны (обработчик событий выполняется в потоке, отличном от вашего метода Run()), но это не имеет никакого отношения к доступу к переменным-членам вашего класса WorkerRole. Код в обработчиках событий является методами экземпляра, а не статическими методами, поэтому они могут получить доступ к членам класса.