【问题标题】:Return RedirectToAction in MVC using async & await使用异步和等待在 MVC 中返回 RedirectToAction
【发布时间】:2017-04-19 11:42:16
【问题描述】:

我想在 dot net 4.5 中使用 Async 和 await 功能返回一个操作。 我使用了以下代码。

public async Task<ActionResult> DisplayDashboard()
    {
        await Task.Run(() =>
        {
            if (true)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Error", "Home");
            }
        });            
    }

它给出以下错误, “无法将 lambda 表达式转换为委托类型 'System.Action',因为块中的某些返回类型不能隐式转换为委托返回类型”。

谁能建议我如何使用 Task 执行 RedirectToAction。

【问题讨论】:

  • 你是什么意思返回视图重定向到操作? (你不能两者都做)
  • 请注意,在 ASP.NET 中使用 Task.Run 会损害您的性能,因为您只会从一个线程池线程切换到另一个线程池线程并返回 - 2 个无用的线程切换。

标签: c# asp.net-mvc async-await


【解决方案1】:
    public async Task<ActionResult> DisplayDashboard()
    {
        return await Task.Run<ActionResult>(() =>
        {
            if (true)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return View("Index");
            }
        });
    }

【讨论】:

  • if(true) 条件的目的是什么?
  • @Amol 可能知道目的:)
【解决方案2】:

为什么需要异步代码?如果你只需要让这个方法返回一个任务来满足一些接口要求,那么使用:

public Task<ActionResult> DisplayDashboard()
{
        ActionResult result;
        if (true)
        {
            result = RedirectToAction("Index", "Home");
        }
        else
        {
            result = View("Index");
        }
        return Task.FromResult(result);
    }

Task.Run() 实际上会使用与您传递给它的代码不同的线程。看来您不需要在这里这样做。

【讨论】:

  • 我的代码太大,放在这里。我有一个要求,我必须使用 Task 重定向到操作或返回视图。这就是为什么我必须使用异步
  • 在我的情况下,我打电话给HttpClient,因为天哪,小F'er 不再允许除了async 调用之外的任何东西,我的整个frick'en 图现在必须是异步的。 (FACE-frick'en-PALM)
【解决方案3】:

这是旧的,但它是从 Google 返回的第一个结果,因此值得更正。无法继续从 RedirectToAction() 或 View() 返回,所以为什么要等待结果。因此不需要人为的 Task.Run() 只是等待它。 async 关键字已经将任何返回提升到任务中。生成的代码更干净。

public async Task<ActionResult> DisplayDashboard()
{
    if (true)
    {
        return RedirectToAction("Index", "Home");
    }
    else
    {
        return View("Error");
    }
}

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2015-08-05
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多