8

、このコードasynсタスクとタスクのみを使用する違いは何ですか?例えば

public Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     return result 
      .GetStringAsync() 
      .ContinueWith(Desereialize<IList<NewsSentimentIndexes>>); 
    } 

と1が正しいか、より高速に動作していること

public async Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h") 
    { 
     var result = _conf.BasePath 
      .AppendPathSegment("news-sentiment-indexes") 
      .SetQueryParams(new 
      { 
       from = from.ToString("s"), 
       to = to.ToString("s"), 
       grouping 
      }); 

     var newsStr = await result.GetStringAsync(); 
     return JsonConvert.DeserializeObject<NewsSentimentIndexes>(newsStr); 
    } 

の違いは? ちょうどこのメソッドを待つ必要があるか、単にタスクを呼び出す必要がありますか?

答えて

6

asyncが良いです。 ContinueWithではなく、常にawaitを使用することをお勧めします。私は私のブログのwhy ContinueWith is badの詳細に行きます。

これら2つの実装の意味の違いは、asyncが使用されているかどうか、ContinueWithが使用されているかどうかの2つの違いによるものです。

asyncを削除すると例外のセマンティクスが変更されます。 asyncを使用すると、(コンパイラが生成したステートマシンによって)すべての例外がキャッチされ、返されたタスクに配置されます。 asyncがなければ、例外は直接(同期的に)発生します。したがって、BasePath,AppendPathSegment,SetQueryParamsまたはGetStringAsync throw(またはそのようなものを返します)(nullなど)の場合、非同期ではなく同期的に発生し、発信者を混乱させる可能性があります。

ContinueWithを使用すると、実行セマンティクスが変更されます。この場合、DeserializeTaskScheduler.Currentにスケジュールされます。この現在のTaskSchedulerへの依存は、ContinueWithの最も難しい部分の1つです。

+0

WaitAllとその続行方法を教えてください。 DateTime.Now) .ContinueWith(ContinuationAction)、 _tradingPairService.GetAllExchangeTradingPairAsync(ExchangeId、TradingPairId:それはのawait –

+0

'Task.WaitAll( _newsService.GetAll(DateTime.Now.AddYears(-1)、とを使用することは不可能です).ContinueWith(ContinuationAction)、 _companyTypesService.GetAll()。ContinueWith(ContinuationAction)); ' –

+0

私はあなたのブログを読んでいただきありがとうございますが、あなたはWaitAllの例と同じ作業をしています。 同じことを続ければ –

-3

非同期タスクはオブジェクトを返しますが、タスクは返しません。

ですから、非同期タスクでこれを行うことができます。

var yourTask = AsyncTask() 

を使用すると、通常のタスクでこれを行うことができますが:Task

NormalTask().someFunction() 
5

どちらのメソッドも同じ型を返します。しかし、asyncメソッドでは、awaitというキーワードを自分の体に使用することができます。 awaitとそのすべてのステートマシンを生成するようにコンパイラに通知します。非同期/あなたが読むことができるパフォーマンスを待つthis post

+0

しかし、どちらのメソッドも非同期です –

+0

はい、そうです。さらに、 'await'をどのようなメソッド(非同期でも非同期でもない)で使うことができます。 – g4s8

関連する問題