【问题标题】:Problems with Azure SDK 2.5 (RoleEntryPoint) WorkerRoleAzure SDK 2.5 (RoleEntryPoint) WorkerRole 的问题
【发布时间】:2015-01-06 04:52:55
【问题描述】:

我最近将我的项目从 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();
    }
}

WorkerEntryPoint1.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)
        {

        }
    }
}

WorkerRole.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.MissingMethodException:无法创建抽象类

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

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

信任是一种弱点......

【问题讨论】:

    标签: c# azure


    【解决方案1】:

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

    一种解决方法是将抽象类移动到不同的程序集中,并将您希望在辅助角色项目中使用的类保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多