【问题标题】:How do I make this an asynchronous controller method?如何使它成为异步控制器方法?
【发布时间】:2016-03-06 00:21:59
【问题描述】:

我有一个方法

    public void AddOrUpdateAnswer ( AnswerSubmission Answer, Guid pid )
    {
        this._Conn.Open();
        using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
            cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
            cmd.Parameters.AddWithValue("@PartnerId", pid);
            cmd.ExecuteNonQuery();
        }
        this._Conn.Close();
    }

我需要将其转换为异步任务,因为我发现每当我有多个用户一次主动提交答案时,它就会使我的 Web 应用程序 (502 Bad Gateway) 崩溃。所以我知道我需要做的就是让这个 who thing 成为一个异步方法。目前,它被我的控制器调用,如

    [HttpPost]
    public ActionResult SubmitAnswer ( AnswerSubmission Answer, Guid pid)
    {
        bool goodSoFar = true;
        string status = "Answers submitted successfully";
        try
        {
            this._Db.AddOrUpdateAnswer(Answer, pid);
        }
        catch (Exception e)
        {
            goodSoFar = false;
            status = String.Format("Exception occured during answer submission: {0}", e.Message);
        }
        return Json(new { Succeeded = goodSoFar, Message = status });
    }

所以我认为我需要做的就是做到这一点 喜欢

    [HttpPost]
    public async Task<ActionResult> SubmitAnswer ( AnswerSubmission Answer, Guid pid)
    {
        bool goodSoFar = true;
        string status = "Answers submitted successfully";
        try
        {
            await this._Db.AddOrUpdateAnswer(Answer, pid);
        }
        catch (Exception e)
        {
            goodSoFar = false;
            status = String.Format("Exception occured during answer submission: {0}", e.Message);
        }
        return Json(new { Succeeded = goodSoFar, Message = status });
    }

但是我该怎么处理AddOrUpdateAnswer?我尝试将其更改为

public Task AddOrUpdateAnswer

但后来我得到了不是所有路径都返回值的错误。我应该返回什么?

【问题讨论】:

  • async 不会改变您的网络应用程序的语义。如果您获得带有同步代码的 502,那么您将获得带有异步代码的 502。

标签: c# asp.net ajax asynchronous thread-safety


【解决方案1】:

您只需要将您的方法转换为异步:

public async Task AddOrUpdateAnswerAsync ( AnswerSubmission Answer, Guid pid )
    {
        await this._Conn.OpenAsync();
        using (SqlCommand cmd = new SqlCommand("AddOrUpdateAnswer", this._Conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@AnswerVal", Answer.AnswerVal);
            cmd.Parameters.AddWithValue("@QuestionId", Answer.QuestionId);
            cmd.Parameters.AddWithValue("@PartnerId", pid);
            await cmd.ExecuteNonQueryAsync();
        }
        this._Conn.Close();
    }

查看here了解更多详情

【讨论】:

  • 您应该将连接包装在 using 语句中,因为它实现了 IDisposable。
  • @mason 我只是将他的代码设为异步。不知道为什么他有一个 _Conn 而不是 using
  • 是的,但是当有人做了一些危险的事情,比如不确保连接关闭或者他们打开了 SQL 注入攻击,你应该认为你有责任让他们知道。此外,您的语法无效。没有类型task
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多