Azure Web角色上的WaitHandleCannotBeOpenedException以Task.Wait()开头
返回后,以下(Web)角色入口点会导致抛出以下exception。
public class WebRole : RoleEntryPoint { public override bool OnStart() { Task.Run(() => { // Anything can be here, but the lamdbda can be empty too... }).Wait(); return true; } }
例外:
mscorlib.dll中出现’System.Threading.WaitHandleCannotBeOpenedException’类型的第一次机会exception
附加信息:不存在给定名称的句柄。
很明显,这是从框架中抛出的。 这个例外似乎是无害的,我没有遇到任何问题。
我还好奇,为什么会这样呢? 有没有办法在角色启动方法中运行异步代码而不会导致此类exception?
编辑:
这是exception的调用堆栈:
> mscorlib.dll!System.Threading.EventWaitHandle.OpenExisting(string name, System.Security.AccessControl.EventWaitHandleRights rights) Unknown Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal() Unknown Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRole() Unknown Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.StartRole.AnonymousMethod__2() Unknown mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Unknown mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Unknown mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) Unknown mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() Unknown [Native to Managed Transition]
编辑2:
这是有问题的Azure运行时源:
private void StartRoleInternal() { string environmentVariable = Environment.GetEnvironmentVariable("RdRoleId"); string name = RoleEnvironment.NormalizeEventName("Global\\started_{0}", environmentVariable); try { using (EventWaitHandle eventWaitHandle = EventWaitHandle.OpenExisting(name, EventWaitHandleRights.Modify)) { eventWaitHandle.Set(); } } catch (WaitHandleCannotBeOpenedException) { } RoleEnvironment.TraceSource.TraceEvent(TraceEventType.Information, 203, "Role entrypoint . CALLING Run(): " + this.role); SystemEvents.LogEventToSystemEvents("Windows Azure Runtime 2.3.0.0", RuntimeEventType.OnRoleRunBegin, "Role is running: OnRun(): " + this.role); this.role.Run(); RoleEnvironment.TraceSource.TraceEvent(TraceEventType.Warning, 204, "Role entrypoint . COMPLETED Run() ==> ROLE RECYCLING INITIATED: " + this.role); SystemEvents.LogEventToSystemEvents("Windows Azure Runtime 2.3.0.0", RuntimeEventType.OnRoleRunEnd, "Role will recyle: OnRun(): " + this.role); RoleEnvironment.RequestRecycle(); }