如何在 MVC4 中执行异步调用操作方法

Posted

技术标签:

【中文标题】如何在 MVC4 中执行异步调用操作方法【英文标题】:How to do an async call to action method in MVC4 【发布时间】:2017-04-25 17:12:19 【问题描述】:

我这里有以下场景。 DB调用异步运行时如何进行一些并行处理。

/// <summary>
    /// Async query EF6.0
    /// </summary>
    /// <returns></returns>
    public async Task<ActionResult> AsyncQuery()
    
        var result = await GetAsyncDepartments();
        Debug.WriteLine("Do some stuff here");

        return View("Index");
    

    private async Task<List<Department>> GetAsyncDepartments()
    
        var depts = new List<Department>();
        using (var newContext = new DemoEntities())
        
            depts = await newContext.Departments.ToListAsync();
        
        Debug.WriteLine("Got departments");
        return depts;
    

它实际上是在等待任务完成,然后进入语句“Do some stuff here”。

如何异步调用 GetAsyncDepartments() 并做一些额外的事情,直到调用返回。 谢谢。

【问题讨论】:

在需要使用之前不要await结果。 【参考方案1】:

GetAsyncDepartments 将返回 Task 的实例,您可以在执行“一些人员”之后“等待”。

public async Task<ActionResult> AsyncQuery()

    var task = GetAsyncDepartments();
    Debug.WriteLine("Do some stuff here");

    await task;
    return View("Index");

【讨论】:

【参考方案2】:

await 要求您的代码等待调用。您可以致电GetAsyncDepartments,但只有在需要时才能获得结果await。例如:

async Task Main()

    var finalResult = await AsyncQuery();
    Console.WriteLine(finalResult);


public async Task<int> AsyncQuery()

    var result = GetAsyncDepartments();
    Debug.WriteLine("Do some stuff here");
    return await result;


public async Task<int> GetAsyncDepartments()

    Console.WriteLine("Starting GetAsyncDepartments");
    await Task.Delay(5000);
    Console.WriteLine("Finished GetAsyncDepartments");
    return 5;

产生输出:

启动 GetAsyncDepartments 在这里做一些事情 完成 GetAsyncDepartments 5

【讨论】:

感谢您的回答。这真的很解释。但是,我选择了其他答案只是因为所需的更改很少。

以上是关于如何在 MVC4 中执行异步调用操作方法的主要内容,如果未能解决你的问题,请参考以下文章

动作过滤器:如何调用服务层和异步方法

以同步方式执行异步调用

Java 多线程 同步和异步

MSDN搬运 之 [使用 IAsyncResult 调用异步方法]

MVC4 Action 两种异步方式

在 T4 文本模板中调用异步方法?