首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AzureSDK2.5 (RoleEntryPoint) WorkerRole存在的问题

AzureSDK2.5 (RoleEntryPoint) WorkerRole存在的问题
EN

Stack Overflow用户
提问于 2014-12-19 13:26:37
回答 1查看 404关注 0票数 2

我最近将我的项目从AzureSDK2.3升级到SDK2.5,我遇到了一个非常令人沮丧的问题。我使用以下代码:

ThreadedRoleEntryPoint1.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
    }
}

因为SDK2.5,我在Azure模拟器中得到了以下错误:

无法创建运行时角色入口点: System.MissingMethodException:无法创建抽象类

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

任何理解并能帮助我解决这个问题的人,谢谢!

信任是一个弱点..。

EN

回答 1

Stack Overflow用户

发布于 2015-01-05 20:52:55

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27567111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档