gpt4 book ai didi

c# - 异步无效方法如何报告 ASP.NET Core 应用程序中的进度

转载 作者:行者123 更新时间:2023-12-03 18:32:12 25 4
gpt4 key购买 nike

在 .NET Framework 中,async void 方法在启动或完成时通知它们的同步上下文,并且从 async void 方法抛出的任何异常都直接引发到 synchronization context 。在 ASP.NET Core 中,此同步上下文 was removed

那么,由于同步上下文不再存在,async void 方法在哪里报告它开始、完成以及是否在 ASP.NET Core 应用程序中发生任何异常?

最佳答案

TLDR: 没有同步上下文,意思是不通知上下文操作开始和结束。在线程池线程上抛出异常。
async void 方法将由编译器转换。以此为例

public async void Test() 
{
}

结果生成的代码看起来像这样
public void Test()
{
<Test>d__0 stateMachine = new <Test>d__0();
stateMachine.<>4__this = this;
stateMachine.<>t__builder = AsyncVoidMethodBuilder.Create();
stateMachine.<>1__state = -1;
AsyncVoidMethodBuilder <>t__builder = stateMachine.<>t__builder;
<>t__builder.Start(ref stateMachine);
}

这里的重要部分是 AsyncVoidMethodBuilder struct 。查看 Create() 函数,您可以看到它试图找到当前的 SynchronizationContext ,如果有,则调用 virtual OperationStarted() 。由于 .net core 没有同步上下文,这将被跳过。

这个构建器的下一个有趣部分是 AwaitUnsafeOnCompleted() 。这是在您的方法中调用的函数,您有一个 await 。如果在那里突然出现异常, ThrowAsync() 就会发生,这将在线程池线程上抛出异常,因为没有同步上下文。

关于c# - 异步无效方法如何报告 ASP.NET Core 应用程序中的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com