インタフェースが明確にこれはタスクであることを指定し、ここで私が取得する必要がありますタスクではなく、値です。https://msdn.microsoft.com/en-us/library/hh191443
ような方法があることが期待されている: - 慣例により - また、「非同期」で終わるインタフェースがなければならないメソッドの名前は、タスクまたはタスク<T>を返すメソッドを宣言する
戻り値の型がちょうどタスクであれば、戻り値の型は、タスク<T>か、まったく何として宣言されている場合はタイプTのオブジェクトを返す非同期メソッドとして実装:
public interface IService
{
Task<double> GetDataAsync(int id);
}
public class Service : IService
{
public async Task<double> GetDataAsync(int id)
{
await Task.Delay(1000);
return 1.0;
}
}
あなたがsuコマンドを待つだろうCH方法:
public class Consumer
{
public async void Doit()
{
IService service = new Service();
double d = await service.GetDataAsync(1);
}
}
は今の方法は、実際には非同期メソッドとしてを実装しているかどうかインタフェースの具体的な実装では、実装の詳細ですが、それは限りインタフェースの消費者としては本当に問題ではありませんタスクまたはタスクを返すメソッドを常に待つことができます(ただし、呼び出し元メソッドにはasyncキーワードが付いていることが条件です)。
あなたは、たとえば同じようにする方法の以下の非非同期実装を待つことができるようになりますことを意味しているタスクまたはタスク<T>の戻り値の型を持っている
ので
public class Service : IService
{
public Task<double> GetDataAsync(int id)
{
return Task.FromResult(1.0);
}
}
方法非同期で待ち受けています。しかしこれは、単純にそれを作るその戻り値を待たずに、非同期を呼ぶだろう
public void Doit()
{
IService service = new Service();
Task<double> task = service.GetDataAsync(1);
}
:
あなたははまだかかわらず、「いつものように」変数のメソッドの実際の戻り値の型のインスタンスを格納することができ最初の場所でメソッドを呼び出すこともかなり役に立たない。 <ダブル>を返すメソッドを呼び出すときは、を非同期にのdouble値に戻したいと考えています。私が何を意味しているのか分かっていれば、Taskオブジェクト自体は本当に気にしません。
出典
2016-12-20 16:32:39
mm8
これは、タスクがダブルを返すためです。 GetDataはバックグラウンドでデータを取得し、dobuleとしてメインスレッドの結果に戻ります –
Sasha
'await'キーワードの詳細を読む – Backs
私はそれを呼び出す方法を変えるべきでしょうか?タスク t = Task.Run (()=> _svc.GetData(id)); ? –