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(); }