Problems with Azure SDK 2.5 (RoleEntryPoint) WorkerRole

本文关键字:RoleEntryPoint WorkerRole with Azure SDK Problems | 更新日期: 2023-09-27 18:34:46

我最近将我的项目从Azure sdk 2.3升级到sdk 2.5,我遇到了一个非常令人沮丧的问题。我正在使用以下代码:

ThreadedRoleEntryPoint1.cs

public abstract class ThreadedRoleEntryPoint1 : RoleEntryPoint
{
    protected ThreadedRoleEntryPoint1()
    {
        Threads = new List<Thread>();
        EventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
    }
    private List<Thread> Threads;
    private WorkerEntryPoint1[] _workers;
    protected EventWaitHandle EventWaitHandle;
    public WorkerEntryPoint1[] workers { get; set; }
    public override void Run()
    {
        foreach (WorkerEntryPoint1 worker in _workers) { Threads.Add(new Thread(worker.ProtectedRun)); }
        foreach (Thread thread in Threads) { thread.Start(); }
        while (!EventWaitHandle.WaitOne(0))
        {
            for (Int32 i = 0; i < Threads.Count; i++)
            {
                if (!Threads[i].IsAlive)
                {
                    Threads[i] = new Thread(_workers[i].Run);
                    Threads[i].Start();
                }
            }
            EventWaitHandle.WaitOne(1000);
        }
    }
    //public override bool OnStart(WorkerEntryPoint1[] workers)
    public override bool OnStart()
    {
        this._workers = workers;
        foreach (WorkerEntryPoint1 worker in workers) { worker.OnStart(); }
        return base.OnStart();
    }
    //public override bool OnStart()
    //{
    //    throw (new InvalidOperationException());
    //}
    public override void OnStop()
    {
        EventWaitHandle.Set();
        foreach (Thread thread in Threads) { while (thread.IsAlive) { thread.Abort(); } }
        foreach (Thread thread in Threads) { while (thread.IsAlive) { Thread.Sleep(10); } }
        foreach (WorkerEntryPoint1 worker in _workers) { worker.OnStop(); }
        base.OnStop();
    }
}

辅助角色入口点1.cs

public abstract class WorkerEntryPoint1
{
    public virtual bool OnStart()
    {
        return (true);
    }
    public virtual void Run()
    {
    }
    public virtual void OnStop()
    {
    }
    internal void ProtectedRun()
    {
        try
        {
            Run();
        }
        catch (SystemException)
        {
            throw;
        }
        catch (Exception)
        {
        }
    }
}

工作人员角色.cs

internal class GlobalWorkerRole : ThreadedRoleEntryPoint1
{
    public GlobalWorkerRole()
    {
        _maxConnections = 10
    }
    private readonly int _maxConnections;
    public override void Run()
    {
        try
        {
            base.Run();
        }
        catch (Exception error)
        {
            Trace.WriteLine(error.ToString(), "EXCEPTION");
            throw error;
        }
    }
    public override bool OnStart()
    {
        ServicePointManager.DefaultConnectionLimit = _maxConnections;
        List<WorkerEntryPoint1> workers = new List<WorkerEntryPoint1>
        {
            new ParseFeedMultiThreadWorker(),
            new CheckFeedStateWorker(),
            new ParseNewProductsWorker(),
            new UpdateProductInformationWorker(),
            new CleanTablesWorker(),
            new RebuildTablesWorker()
        };
        this.workers = workers.ToArray();
        return base.OnStart();
    }
}

从 sdk 2.5 开始,我在 Azure 模拟器中收到以下错误:

[运行时] 无法创建角色入口点:System.MissingMethod异常:无法创建抽象类

我的猜测是,这与ThreadedRoleEntryPoint1继承自RoleEntryPoint的事实有关,RoleEntryPoint调用抽象类的OnStart而不是GlobalWorkerRole。

任何理解并可以帮助我解决此问题的人,谢谢!

信任是一个弱点...

Problems with Azure SDK 2.5 (RoleEntryPoint) WorkerRole

该问题与主机如何搜索入口点有关。它似乎找到从 RoleEntryPoint 继承的第一个类,然后实例化该类,而不是查找非抽象类。

解决方法是将抽象类移动到其他程序集中,并保留要在辅助角色项目中使用的类。