2017-08-04 16 views
2

私はAsync Awaitの概念を少し新しくしました。リポジトリ非同期Awaitパラメータ付きメソッドの問題

public TEntity Get(int id) 
    { 
     return Context.Set<TEntity>().Find(id); 
    } 

で次のメソッドを持っている私は、これはサーバの速度と等によっては時間がかかる可能性があるので、これを非同期にしたい

BindingSource.DataSource = unitOfWork.ClientDemos.Get(newClient.ClientId); 

別のメソッドからこのメソッドを呼び出します。実際にこれをどうやって行うのですか?私が疲れたときはいつも、私は異なった種類のエラーを出しました。私は間違ったアプローチで皆さんを悩ませたくありません。しかし、ここに私が試して働かなかったものがあります。

Task <IEnumerable<ClientDemographic>> tsk= new Task <IEnumerable<ClientDemographic> >(unitOfWork.ClientDemos.Get(newClient.ClientId)); 
       tsk.Start(); 
       BindingSource.DataSource = await tsk; 

これは、渡すパラメータがなく、戻り値の型がintの場合には不思議なことです。以下のように。これはうまくいく。

この問題については、いくつか明記してください。ほんとうにありがとう! 乾杯! ありがとう!

+1

使用 'Task.Run'ともhttps://msdn.microsoft.com/en-us/magazine/jj991977.aspxこの上に読むためにいくつかの時間がかかります – Nkosi

+1

'BindingSource.DataSource = unitOfWork.ClientDemos.Get(newClient.ClientId);'を持つメソッドからさらにコードを表示するには、これは 'Task.Run'や' new Task'を使わずに行うことができますが、そのデータバインディングを設定するメソッドを見なければならない良い例です。また、実際に 'Context.Set ().Find(id);'で使用しているライブラリのドキュメントをチェックして、 'FindAsync(id)'呼び出しがある可能性があります。他のスレッドで '.Find'を実行する代わりに、最後に、あなたが示した例についてはうまくいかなかったが、うまくいかなかった。 –

答えて

1

一般的に言えば、newタスクオブジェクトはありません。あなたはそれらを返すメソッドを持っている(またはそれらを生成するためにTask.Runを使う)。 APIを一方向に強制的に強制するか、または他方を嫌う。 ContextFindAsyncメソッドを持っていない限り、私は希望:

Task<int> unitTask = Task.Run(() => unitOfWork.Complete(whateverArgs)); 
await unitTask; 
2

上に読んでください、 FindAsyncメソッドがあります。そのような場合は、Task.Runよりも使用する方が良いでしょう。その後

public async Task<TEntity> GetAsync(int id) 
{ 
    return await Context.Set<TEntity>().FindAsync(id); 
} 

BindingSource.DataSource = await unitOfWork.ClientDemos.GetAsync(newClient.ClientId);