从Task <>获取对象

Boj*_*jan 5 c# asp.net-mvc-5

我有以下方法:

private async Task<Request> UpdateRequest(string id, RequestOutcome outcome)
{
    var request = Db.Request.Where(r => r.Id.ToString().Equals(id)).First();
    request.DateLastRead = DateTime.Now;
    request.DateConcluded = request.DateLastRead;
    request.Outcome = (int) outcome;

    Db.Entry(request).State = EntityState.Modified;

    if (await Db.SaveChangesAsync() <= 0) return null;
    return outcome == RequestOutcome.Accept ? request : null;
}
Run Code Online (Sandbox Code Playgroud)

这由以下内容调用:

public ActionResult Accept(string id)
{
    var request = UpdateRequest(id, RequestOutcome.Accept);

    if (request.Result != null)
    {
        var c = request.DateConcluded;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 如何在方法之外检查更新是否成功?我该说request != null吗?当我这样做时,我不断得到一个警告,表达总是如此.

  2. 如何访问request.DateConcluded属性,因为它已被创建为任务.

Xel*_*ela 8

您正在同步运行异步代码.

您必须await在方法之前使用异步运行方法 - 这将处理为您获取任务的结果.

如果同步运行代码,则必须获得任务的结果.

对于异步:

public async Task<ActionResult> Accept(string id)
{
    var request = await UpdateRequest(id, RequestOutcome.Accept);

    if (request!= null)
    {
        var c = request.DateConcluded;
    }
}
Run Code Online (Sandbox Code Playgroud)

用于同步

public ActionResult Accept(string id)
{
    var request = UpdateRequest(id, RequestOutcome.Accept).Result;

    if (request != null)
    {
        var c = request.DateConcluded;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为`public async ActionResult Accept(string id)`会编译.它不需要是`public async Task <ActionResult> Accept(string id)`? (3认同)
  • “.Result”解决了这个问题。谢谢! (2认同)