【发布时间】:2017-08-11 03:29:21
【问题描述】:
我想了解在从控制器调用时我不需要PostAsync 调用结果的场景中究竟发生了什么。
比如我有一些动作
[HttpPost]
public ActionResult DoSomething(SomeModel model)
{
...
PostDataFireAndForget(model);
...
return new EmptyResult();
}
private void PostDataFireAndForget(SomeModel model)
{
try
{
using (var client = new HttpClient())
{
string targetUrl="SomeUrl";
client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content));
}
}
catch (Exception ex)
{
//we didn't care about the response, no additional requirements here
//ignore
}
}
所以我想知道在所有可能的情况下它将如何进行以及为什么。最有趣的一个场景是 PostAsync 比它之后的所有其他操作代码花费的时间更长,因此操作在 PostAsync 完成之前完成。它会被终止/阻止/完成吗?如果我想执行某种异步操作并且不想等待结果,有没有更好的方法?
【问题讨论】:
-
使 fire and forget 方法异步,以便可以捕获和忽略异常。在其当前设计中,它可能导致主操作请求的线程崩溃。通过使其异步,该方法可以处理(或在这种情况下不处理)异常并让其他线程继续。
-
ASP.NET 中的即发即弃(及其陷阱)已在 SO 上多次讨论,请搜索
QueueBackgroundWorkItem。
标签: c# .net asp.net-mvc async-await