为什么这个 NServiceBus 消息处理程序在调用 Task.CompletedTask 时抛出 System.MethodAccessException?
Why does this NServiceBus message handler throw System.MethodAccessException on call to Task.CompletedTask?
在查看文档并试图找到开发人员遇到此错误的其他示例后,我有点卡住了。我们正在使用 NServiceBus 6,偶尔会在调用 return Task.CompletedTask
的消息处理程序中得到 System.MethodAccessException
。它似乎只在处理程序部署在 Azure 辅助角色中时发生(与模拟器中的 运行 相反)。我们正在使用 Azure 服务总线传输。
public Task Handle(UpdatePatientAccommodationCode message, IMessageHandlerContext context)
{
Console.WriteLine($"Handling [{message.GetType()}]");
var patientVisit = LoadByExternalPatientId(message.ClientId, message.ExternalPatientId);
var mappedEvent = patientVisit.HandleCommand(message);
if (patientVisit.IsEventAdded)
PatientVisitEventStore.Save(patientVisit);
return mappedEvent == null ? Task.CompletedTask : context.Publish(mappedEvent);
}
实际异常是这样的:
System.MethodAccessException: Attempt by method 'XXX.Handlers.PatientVisitHandler.Handle(XXX.UpdatePatientAccommodationCode, NServiceBus.IMessageHandlerContext)' to access method 'System.Threading.Tasks.Task.get_CompletedTask()' failed.
at XXX.Handlers.PatientVisitHandler.Handle(UpdatePatientAccomm odationCode message, IMessageHandlerContext context) in PatientVisitHandler.cs: line 314
at NServiceBus.InvokeHandlerTerminator.Terminate(IInvokeHandlerContext context) in C:\BuildAgent\work06e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\Invok eHandlerTerminator.cs: line 24
at NServiceBus.LoadHandlersConnector.<Invoke>d__1.MoveNext() in C:\BuildAgent\work06e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\LoadH andlersConnector.cs: line 40
我怀疑你的本地代码有 .NET framework 4.6.x 支持 Task.CompletedTask
。当您部署到 CS 并使用 OS family less than version 5 won't have support for 4.6.x You either will need to use a startup task to install 4.6.x or migrate to OS Family 5 (Server 2016).
这很奇怪。从 Task.CompletedTask
I can't come up with a scenario where this could happen. The task that is statically cached is initialized with RAN_TO_COMPLETION
和 DO_NOT_DISPOSE
的参考来源判断。基于此,我建议您确定您使用的是 .NET Framework 4.6 版还是更高版本。如果您这样做并且仍然看到异常,请尝试将 Task.CompletedTask
替换为
static class TaskEx
{
public static readonly Task CompletedTask = Task.FromResult(0);
}
在查看文档并试图找到开发人员遇到此错误的其他示例后,我有点卡住了。我们正在使用 NServiceBus 6,偶尔会在调用 return Task.CompletedTask
的消息处理程序中得到 System.MethodAccessException
。它似乎只在处理程序部署在 Azure 辅助角色中时发生(与模拟器中的 运行 相反)。我们正在使用 Azure 服务总线传输。
public Task Handle(UpdatePatientAccommodationCode message, IMessageHandlerContext context)
{
Console.WriteLine($"Handling [{message.GetType()}]");
var patientVisit = LoadByExternalPatientId(message.ClientId, message.ExternalPatientId);
var mappedEvent = patientVisit.HandleCommand(message);
if (patientVisit.IsEventAdded)
PatientVisitEventStore.Save(patientVisit);
return mappedEvent == null ? Task.CompletedTask : context.Publish(mappedEvent);
}
实际异常是这样的:
System.MethodAccessException: Attempt by method 'XXX.Handlers.PatientVisitHandler.Handle(XXX.UpdatePatientAccommodationCode, NServiceBus.IMessageHandlerContext)' to access method 'System.Threading.Tasks.Task.get_CompletedTask()' failed.
at XXX.Handlers.PatientVisitHandler.Handle(UpdatePatientAccomm odationCode message, IMessageHandlerContext context) in PatientVisitHandler.cs: line 314
at NServiceBus.InvokeHandlerTerminator.Terminate(IInvokeHandlerContext context) in C:\BuildAgent\work06e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\Invok eHandlerTerminator.cs: line 24
at NServiceBus.LoadHandlersConnector.<Invoke>d__1.MoveNext() in C:\BuildAgent\work06e2123f54fce4\src\NServiceBus.Core\Pipeline\Incoming\LoadH andlersConnector.cs: line 40
我怀疑你的本地代码有 .NET framework 4.6.x 支持 Task.CompletedTask
。当您部署到 CS 并使用 OS family less than version 5 won't have support for 4.6.x You either will need to use a startup task to install 4.6.x or migrate to OS Family 5 (Server 2016).
这很奇怪。从 Task.CompletedTask
I can't come up with a scenario where this could happen. The task that is statically cached is initialized with RAN_TO_COMPLETION
和 DO_NOT_DISPOSE
的参考来源判断。基于此,我建议您确定您使用的是 .NET Framework 4.6 版还是更高版本。如果您这样做并且仍然看到异常,请尝试将 Task.CompletedTask
替换为
static class TaskEx
{
public static readonly Task CompletedTask = Task.FromResult(0);
}