2017-02-01 49 views
1

この状態についてはわかりません。私は非同期データベースからデータを取得する必要があります。データをロード(async/await)

私はクラスDBビューモデルにおいて

public class Db{ 

public async Task<ObservableCollection<Person>> GetAllPerson() 
{ 
using (var context = new Db()) 
{ 
    // get data and return ObservableCollection<Person> 
} 
}    

}

Iが呼び出すloaddataの機能を有しています。

public class VM{ 

    public ObservableCollection<Person> Person { get; set; } 
private readonly DB sqlRepository; 

public VM() 
{ 
    sqlRepository=new DB(); 
    LoadData(); 
} 
private async void LoadData() 
    { 
     Person= await sqlRepository.GetAllPerson(); 
    } 

}

私は警告ました:警告CS1998この非同期メソッドは、演算子を '待つ' と同期的に実行されますが欠如しています。

どのように私の関数を非同期で実行できますか? 私は使用すべきですか?

Person=await Task.Run(()=>this.sqlRepository.GetAllPerson()); 
+0

あなたはそれを試すことができます。私はPerson = await Task.Run(()=> this.sqlRepository.GetAllPerson())を使用しています。私のプロジェクトでは – Venu

+0

このコードが同期して実行されるというメッセージが表示されます。 – leapold

+0

警告はどの行に表示されていますか? – RizJa

答えて

3

どのように私は私の関数は非同期で実行できますか?

間違った方向から問題に近づいています。 ViewModelはデータベースデータを非同期的に読み込みたいと考えています。それは問題をうまく表現するうえでは良い方法ですが、それを解決するのは間違った方法です。

もっと簡単に解決するには、もう一方の端から開始します。実際にデータベースに呼び出すメソッド(Entity Framework呼び出しなど)は、非同期のに最初にとし、そこからasyncを生成させる必要があります。

private async void LoadData() 
{ 
    Person = await sqlRepository.GetAllPersonAsync(); 
} 

しかし、私のMVVM async data binding articleで説明したように、私はNotifyTaskを経由して、それを消費をお勧めします:あなたとして消費することができ

public async Task<ObservableCollection<Person>> GetAllPersonAsync() 
{ 
    using (var context = new Db()) 
    { 
    // This code wasn't shown in the question. 
    // But from the compiler warning, it was probably using something like 
    // var people = People.ToList(); 
    // return new ObservableCollection<Person>(people); 
    // And the async version should be: 
    var people = await People.ToListAsync(); 
    return new ObservableCollection<Person>(people); 
    } 
} 

:最終的にはあなたのようなものになってしまいます。そのアプローチは、ビジーなスピナーやその他のものをデータバインドする能力を与えます。

[Task.Run]を使用しますか?それは非同期だが、それは本当にただ同期バックグラウンドスレッドで実行されているようなあなたのコードの行為 - 「偽非同期」だ

号。

+0

負荷について私はタスクを使用する必要がありますか? – leapold

+0

LoadDataについては、Taskを使用する必要がありますか?プライベート非同期void LoadData() { Person = Task.Factory.StartNew(()=> GetAllPerson()); } – leapold

+0

@leapold:いいえ、あなたは 'StartNew'や' Task.Run'を使うべきではありません。ToListAsyncのような非同期EF APIを使用します。 –