Можете ли вы получить доступ к полям экземпляра из обработчика событий RoleEnvironment.OnRoleChanging?

Я пытаюсь выяснить, как рабочие роли Azure инициируют события RoleEnvironment и как это влияет на доступ к полям.

Со ссылкой на мой пример кода ниже, я понимаю, что:

  1. Обработчики событий RoleEnvironmentChanging и RoleEnvironmentChanged будут выполняться в контексте потока, который инициирует события
  2. Поток событий будет отличаться от потока, блокируемого 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. Код в обработчиках событий является методами экземпляра, а не статическими методами, поэтому они могут получить доступ к членам класса.

Другие вопросы по тегам