簡體   English   中英

EF異步方法-最佳做法/改進

[英]EF Async Methods - best practices / improvements

對不起,這樣的主觀問題:

我目前有一種非常緩慢的順序加載方法,已將其轉換為異步方法:

    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)

謝謝,

克里斯

是的,當您使用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) ,然后調用await Task.WhenAll(tasks)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM