【发布时间】:2014-03-18 15:00:34
【问题描述】:
我有一个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 上的“一劳永逸”实际上意味着“我不在乎这段代码是否真的被执行”?您绝对确定您不关心该代码吗?
-
@Jon 很公平,我显然理解的比我想象的要少。 Stephen Fire and forget 可能是错误的措辞,那么,我只想确保至少尝试过代码。
-
@Jon 看起来我因为没有单独的
async和非async任务返回方法而搞砸了this pattern 的实现。我已经编辑了这个问题,希望能解决这个问题,同时保持其余部分的相关性。 -
虽然我得到了关于 IIS 如何渴望关闭应用程序池并扼杀我的工作的答案和问题,但我真的很感兴趣拥有一个 库是否是个好主意
async方法定义与它背后的 UI 相关的行为。我已经接受了 Jon 的 cmets 关于我如何错误地实现我的同步部分的意见,以及其他人关于这是一个坏主意的评论,TBH 我已经回答了我关于ConfigureAwait的实际问题阅读更多斯蒂芬的博客文章。
标签: c# asp.net async-await synchronizationcontext azure-webjobs