gpt4 book ai didi

c# - 不等待时ConfigureAwait

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:21 25 4
gpt4 key购买 nike

我有一个 async 方法,我用它来卸载几秒钟的即发即弃工作,以免减慢我的页面加载速度。这项工作需要一些一般的设置和整理;我希望(快速)设置在抛出时同步抛出,但我不想强制整理在 ASP 上下文中运行,所以我在等待的位上使用 ConfigureAwait :

public Task FireAndForget()
{
DoSetup();
return FireAndForgetAfterSetup();
}

private async Task FireAndForgetAfterSetup()
{
await AFewSecondsWorthOfWork().ConfigureAwait(false);
DoTidyUp();
}

protected void btn_Click(object sender, EventArgs e)
{
FireAndForget();
}

这看起来很奇怪,因为

  • FireAndForgetAfterSetup 不应该真正关心它是否是从 ASP 上下文中调用的,那么为什么它必须是调用 ConfigureAwait 的那个?
  • 如果我改变主意并决定 btn_Click 应该等待 FireAndForget 完成,它是否已经丢弃了 ASP 上下文(?)

如果我误会了,谁能帮我解释一下?

最佳答案

ASP.NET 同步上下文不允许从请求中启动即发即弃的工作项。运行时会主动监视此类事情,并将尝试生成异常,因为这些代码模式会导致空引用、死锁、AV 和其他问题。

如果您确实需要在 ASP.NET 中开始即发即弃的工作,请考虑使用 WebBackgrounder .它与旨在实现此目的的 ASP.NET 扩展点集成。因此它不会阻止事件请求,但请记住 Stephen 的警告:根本 不能保证它会被执行。如果您需要保证执行,请考虑服务总线等可靠性机制。

关于c# - 不等待时ConfigureAwait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22483128/

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