EF异步方法 - 最佳实践/改进

时间:2016-05-05 14:52:27

标签: c# entity-framework asynchronous task

很抱歉这样的主观问题:

我目前有一个非常慢的顺序加载方法,我已将其转换为异步方法:

    public async void LoadData(int releaseId, int projectId, bool uiThread)

在此方法中,我启动Await任务(并将ConfigureAwait设置为false),因为它不需要从此上下文中捕获和恢复。

     await Task.Run(() =>
     { 
         //make several DB calls as below 

     }).ConfigureAwait(False);

在这个任务中,我对EF /数据库进行了几次异步调用,每次调用都是这样的:

    public async virtual Task<List<X>> FindXAsync()
    {
        var q = from c in context.X
                select c;
        return await q.ToListAsync();
    }

但在我正在等待使用结果的响应的任务中,请参见下文:

    X = sm.FindXAsync().Result;

根据我对EF使用异步编程的有限知识,每个调用都会从任务内部顺序运行吗?

当前设置会同时返回多个返回集还是我必须创建多个任务并分别等待它们。

再次对这个模糊的问题感到抱歉,但我确定你们在这个话题上比我更有经验^^

编辑:我发布那里没有真正合适的问题,我想我想知道的是x,y和z会在任务中同时或顺序返回。

     await Task.Run(() =>
     {
          x = sm.FindXAsync().Result;

          y = new ObservableCollection<Y>(sm.FindYAsync().Result);

          z = new ObservableCollection<Z>(sm.FindZAsync().Result);
     }).ConfigureAwait(False)

谢谢,

克里斯

1 个答案:

答案 0 :(得分:1)

是的,当您使用Result属性时,将按顺序运行。它们也将按顺序运行以下代码:`

    x = await sm.FindXAsync().ConfigureAwait(False);

    y = new ObservableCollection<Y>( await sm.FindYAsync().ConfigureAwait(False));

    z = new ObservableCollection<Z>(await sm.FindZAsync().ConfigureAwait(False));

同时更新

 public async void LoadData to return Task ->  `public async Task LoadData`.

如果您想并行运行所有代码,请将数据添加到数组中,然后调用await Task.WhenAll(tasks)