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

4
我这里有一个场景,当数据库调用异步运行时,如何进行一些并行处理。
/// <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;
    }

实际上,它会等待任务完成,然后继续执行语句“在此处执行一些操作”。

如何异步调用GetAsyncDepartments()并在调用返回之前执行一些额外的操作。 谢谢。


在需要使用结果之前,请不要“等待”它。 - Rob
2个回答

2

GetAsyncDepartments会返回一个Task实例,你可以在执行“一些操作”后使用“await”等待它的执行结果。

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


1
谢谢您的回答。它真的很详细解释了问题。不过,我选择了另一个答案,因为需要做的更少。 - Srikant Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接