我最近将我的项目从AzureSDK2.3升级到SDK2.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();
}
}因为SDK2.5,我在Azure模拟器中得到了以下错误:
无法创建运行时角色入口点: System.MissingMethodException:无法创建抽象类
我的猜测是,这与ThreadedRoleEntryPoint1继承自RoleEntryPoint的事实有关,后者调用抽象类的OnStart而不是GlobalWorkerRole。
任何理解并能帮助我解决这个问题的人,谢谢!
信任是一个弱点..。
发布于 2015-01-05 20:52:55
这个问题与主机如何搜索入口点有关。它似乎找到了继承自RoleEntryPoint的第一个类,然后实例化该类,而不是寻找非抽象类。
解决方法是将抽象类移动到不同的程序集中,并保留希望在worker角色项目中使用的类。
https://stackoverflow.com/questions/27567111
复制相似问题