在模拟器中本地运行时,Web worker工作正常。但是,每当我更新在Azure VM上运行的Web工作器时,我在事件查看器中都会遇到以下异常异常,并且角色将无法启动:
应用程序:WaWorkerHost.exe
框架版本:v4.0.30319
描述:由于未处理的异常,该过程终止 异常信息:System.AggregateException
堆: 在System.Threading.Tasks.Task.Wait(Int32,System.Threading.CancellationToken) 在System.Threading.Tasks.Task.Wait()
在Foo.PushProcess.WorkerRole.Run()
在Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal() 在Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.b__2() 在System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)
在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)
在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)
在System.Threading.ThreadHelper.ThreadStart()内部异常:任务被取消。
错误应用程序名称:WaWorkerHost.exe,版本:2.6.1198.712,时间戳:0x54eba731
错误模块名称:KERNELBASE.dll,版本:6.3.9600.17415,时间戳:0x54505737
例外代码:0xe0434352
故障偏移:0x0000000000008b9c
错误进程id:0xfb8
故障应用程序启动时间:0x01d11e3128981a5d
错误的应用程序路径:E:\ base \ x64 \ WaWorkerHost.exe
错误模块路径:D:\ Windows \ system32 \ KERNELBASE.dll
报告编号:30631c5c-8a25-11e5-80c6-000d3a22f3ec
错误包全名:
错误的包相关应用程序ID:
会话“MA_ETWSESSION_WAD_415df88f8a0447178dbd4c18f1349f0e_Foo.PushProcess_Foo.PushProcess_IN_0”无法启动并出现以下错误:0xC0000035
这是相关代码:
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
_storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
var queueClient = _storageAccount.CreateCloudQueueClient();
_pushQueue = queueClient.GetQueueReference("pushes");
_pushQueue.CreateIfNotExists();
CreatePushBroker();
Trace.TraceInformation("Foo.PushProcess has been started");
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
CloudQueueMessage message = null;
try
{
message = _pushQueue.GetMessage();
if (message != null)
{
ProcessItem(message);
}
}
catch (Exception ex)
{
if (message != null && message.DequeueCount > 5)
_pushQueue.DeleteMessage(message);
Trace.TraceError("[WORKER] Retrieval Failure: " + ex);
}
await Task.Delay(1000, cancellationToken);
}
}
请注意,某些代码已被省略,但这些代码都是在初始化之后运行的,理论上并未达到此异常。
我完全不知道可能导致这个问题的原因。任何帮助将不胜感激 - 即使只是为了帮助我获得一个有用的例外。
更新
我现在已将代码缩减到下面 - 它就像web worker一样简单 - 而且我仍然得到例外。我相信旧工作者正在被缓存,或者部署过程中存在问题。
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
// code removed for testing - no work is being done.
await Task.Delay(1000, cancellationToken);
}
}
答案 0 :(得分:0)
要解决此问题,我只需删除拥有辅助角色的原始Cloud VM实例,重新创建并重新发布该角色。从那时起,它的工作非常好。
我仍然无法确定导致错误的原因,并且没有任何其他问题与任何其他工作人员角色。我的假设是VM存在配置问题,无法通过代码或Azure门户进行修改。