c# - Azure SDK 2.5 (RoleEntryPoint) WorkerRole 的问题

标签 c# azure

我最近将我的项目从 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。

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

信任是一种弱点...

最佳答案

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

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

关于c# - Azure SDK 2.5 (RoleEntryPoint) WorkerRole 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567111/

相关文章:

c# - C# 中的简单优先级队列 - 使用自定义排序器 : IComparer? 会比 List 更好

c# - 根据 [].[] + [].[] 中的正则表达式 [].[] 和 [].[] 拆分字符串

function - 写入 ILogger 的 Azure Functions 日志记录不会出现在 Azure 表存储中

visual-studio - 如何调试我的 Azure 项目中的其他程序集

azure - 如何在 Azure PowerShell Runbook 上应用 SharePoint 网站模板?

azure - flutter 应用程序 : How to implement a proper logout function?

c# - “ExpandoObject”不包含 'PropertyChanged' 的定义

c# - 使用派生类中的其他类型来抽象定义默认行为

c# - testdome.com 中的 TwoSum 和 BinarySearchTree;如何解决警告消息 : Performance test?

javascript - 如何使用 Azure 移动服务中的使用逻辑验证数据