【问题标题】:HttpClient PostAsync from controller without result来自控制器的 HttpClient PostAsync 没有结果
【发布时间】: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


【解决方案1】:

使 fire and forget 方法一直异步,以便可以捕获和忽略异常。在其当前设计中,它可能导致主操作请求的线程崩溃。

private async Task PostDataFireAndForgetAsync(SomeModel model) 
    try {
        using (var client = new HttpClient()) {
            var targetUrl="SomeUrl";
            await client.PostAsync(targetUrl, new FormUrlEncodedContent(model.Content));
        }
    } catch (Exception ex) {
        //we didn't care about the response, no additional requirements here
        //ignore
    }
}

通过使其异步,该方法可以处理(或在这种情况下不处理)异常并让其他线程继续。

[HttpPost]
public ActionResult DoSomething(SomeModel model) {
    //... fire and forget
    PostDataFireAndForgetAsync(model);
    //...
    return new EmptyResult();
}

【讨论】:

  • 在这种情况下,如果 DoSomethingPostDataFireAndForgetAsync 之前完成会发生什么?
  • ASP.NET 同步上下文不是跟踪已启动的任务并等待它们全部完成吗?
【解决方案2】:

总是调用函数/方法来处理输入并呈现输出,这与您是否需要结果无关。如果您不想等待结果,则至少必须等待该过程完成,即使您希望忽略结果。

在您的场景中,您正在发出请求并离开而没有任何结果,尽管所有 UI 进程都可能完成并退出,但应用程序将保留在内存中,直到异步完成。最好在完全结束所有例程之前等待异步完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多