c# - 从 Task<> 获取对象

标签 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;
}

这由以下调用:

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

    if (request.Result != null)
    {
        var c = request.DateConcluded;
    }
}
  1. 如何在方法之外检查更新是否成功?我应该说 request != null 吗?当我这样做时,我不断收到一条警告,指出表达式始终为真。

  2. 我如何访问 request.DateConcluded 属性,因为它已成为一项任务。

最佳答案

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

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

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

对于异步:

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

    if (request!= null)
    {
        var c = request.DateConcluded;
    }
}

同步

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

    if (request != null)
    {
        var c = request.DateConcluded;
    }
}

关于c# - 从 Task<> 获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386478/

相关文章:

c# - 连接字符串最有效的方法?

c# - EntityFramework.BulkInsert 和 MSDTC

c# - 使用 Ajax 不显眼地渲染部分 View

c# - ASP.NET MVC 5 验证 - 属性不同

c# - 无法在 C# 控制台应用程序中添加 System.Drawing 命名空间

c# - 无法使用 GET 访问 API 端点

c# - 使用 Type 变量转换变量

visual-studio-2013 - NuGet 在每次更新时将 System.Runtime 添加到 web.config 导致运行时错误

twitter-bootstrap - 应用 Bootstrap 折叠时,MVC 客户端验证不起作用

c# - 返回 IQueryable 的 Linq 查询中的内部方法