能否从RoleEnvironment.OnRoleChanging事件处理程序访问实例字段

本文关键字:程序 访问 实例 字段 事件处理 OnRoleChanging RoleEnvironment | 更新日期: 2023-09-27 18:28:36

我正试图弄清楚azure工作人员角色如何启动RoleEnvironment事件,以及这如何影响字段访问。

参考我下面的代码示例,我的理解是:

  1. RoleEnvironmentChanging和RoleEnvironment Changed事件处理程序将在启动事件的线程的上下文中运行
  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.
    }
}

能否从RoleEnvironment.OnRoleChanging事件处理程序访问实例字段

您的2条语句是正确的(事件处理程序运行在与Run()方法不同的线程上),但这与访问WorkerRole类的成员变量无关。事件处理程序中的代码是实例方法,而不是静态方法,因此它们能够访问类的成员。