2016-12-20 5 views
-3

私はインターフェイスがあります。C#タスクのタスクの代わりにダブルを取得する理由は何ですか?

public interface IService 
{ 
    Task<double> GetData(int id); 
} 

そして、私は私のクラスでは、このインタフェースを使用する必要があります。

//_svc is a Type of IService 

public async void Doit() 
{ 
    Task<double> task = await _svc.GetData(id); 
} 

そして、私はそれを行うと、それはにdouble型に変換することができないと言われタスク<倍>
なぜタスクの代わりにこの2倍ですか?インターフェイスは、これがタスクであることを明確に指定しています。ここでは、値ではなくタスクを取得する必要があります。

+0

これは、タスクがダブルを返すためです。 GetDataはバックグラウンドでデータを取得し、dobuleとしてメインスレッドの結果に戻ります – Sasha

+2

'await'キーワードの詳細を読む – Backs

+0

私はそれを呼び出す方法を変えるべきでしょうか?タスク t = Task.Run (()=> _svc.GetData(id)); ? –

答えて

4

自分で処理するタスクが必要な場合は、それを処理するawaitを削除します。

+0

あなたは、私が使用することを意味します:タスクタスク= _svc.GetData(id); –

+0

Task.Runは必要ありませんか? –

+0

'Task.Run'はおそらくタスクを返すメソッドの中にあります。 – nvoigt

1

答えはありませんが、タスクをもう少し理解するのに役立ちます。たとえば、あなたは、メソッドとのインタフェースがあります。それは、さらに行く結果となります場合は

var result = await _scv.FindNameAsync(name); //The program will not go to next line, until it becomes result 

System.Threading.Tasks.Task<string> FindNameAsync(string computerName); 

を使用すると、インターフェイスからメソッドを呼び出すと、それはこのようなものになります。 - 偽

System.Threading.Tasks.Task<bool> FindNameAsync(string computerName); 

次に、あなたが他の場合には、成功の場合はtrueを返しことができます。そして、あなたはあなたが少し変更を加えることができますステータスを取得したい場合は 次の方法に

EDITを渡すことができ、結果。 少し修正すれば、オブジェクトとしてメソッドにパラメータとして渡し、必要な値を保存することができます。あるいは、あなたはブールではなく、辞書やタップルを返すことができます。リトル例:

System.Threading.Tasks.Task<bool> FindNameAsync(SomeClass obj); 

そして、あなたはそれを扱うことができます: あなたの方法は、ここでのようにすることができ

SomeClass test = new SomeClass(); 
if(await _scv.FindNameAsync(test)) 
{ 
//code for success result 
}else 
{ 
//if error happened handle here 
} 
+0

これは私が必要なものではありません。私はタスクのステータスを処理する必要があります。だから私は、タスク内のメソッドを呼び出して、ステータスを確認してからcontinueWithで結果を取得する必要があります。 –

+2

@ J.Doe:これを行う必要はありません。あなたは 'ContinueWith'を***使用しないでください。 –

0

インタフェースが明確にこれはタスクであることを指定し、ここで私が取得する必要がありますタスクではなく、値です。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オブジェクト自体は本当に気にしません。

+1

'あなたはそれを待ってそのような非同期メソッドを呼び出すでしょう:'いいえ、それを待ってメソッドを呼び出す*ではありません。 'service.GetDataAsync(1)'を呼び出すことで呼び出すことができます。 'Task'がそれを待って終了したら、メソッドを実行し続けます。大きな違い。 – Servy

関連する問題