8

Zum Beispiel kann der Unterschied zwischen diesem CodeWas ist der Unterschied zwischen der Verwendung von nur asyn Aufgabe und Aufgabe?

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>>); 
    } 

und dass

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); 
    } 

Welches richtig oder schneller arbeiten ist? Und rufen Sie einfach diese Methode muss warten oder nur eine Aufgabe?

Antwort

6

Die async man ist besser. Sie sollten immer lieber await anstelle von ContinueWith verwenden. Ich gehe in die Details von why ContinueWith is bad auf meinem Blog. Die semantischen Unterschiede zwischen diesen beiden Implementierungen sind auf zwei Unterschiede zurückzuführen: ob async verwendet wird und ob ContinueWith verwendet wird.

Entfernen async ändert Ausnahmesemantik. Wenn async verwendet wird, werden alle Ausnahmen abgefangen (durch die vom Compiler generierte Zustandsmaschine) und in die zurückgegebene Task eingefügt. Ohne async werden Ausnahmen direkt (synchron) ausgelöst. Also, wenn BasePath, AppendPathSegment, SetQueryParams, oder GetStringAsync werfen (oder null oder etwas ähnliches zurückgeben), dann würde diese Ausnahme synchron statt asynchron ausgelöst werden, was für Anrufer verwirrend sein könnte.

Mit ContinueWith ändert sich die Ausführungssemantik. In diesem Fall wird Deserialize unter TaskScheduler.Current geplant. Diese Abhängigkeit von der aktuellen TaskScheduler ist einer der schwierigsten Teile von ContinueWith.

+0

Sag mir bitte, wie man ein WaitAll und ihre Fortsetzung ist. Es ist unmöglich, die await –

+0

'Task.WaitAll ( _newsService.GetAll (DateTime.Now.AddYears (-1) zu verwenden, um: DateTime.Now) .ContinueWith (ContinuationAction), _tradingPairService.GetAllExchangeTradingPairAsync (ExchangeID, TradingPairId) ContinueWith (ContinuationAction), _companyTypesService.GetAll(). ContinueWith (ContinuationAction)); ' –

+0

Ich lese Ihren Blog danke, aber Sie müssen WaitAll Beispiel, mit den gleichen Aufgaben. Mit der Fortsetzung derselben –

-3

Async-Task gibt das Objekt zurück, Task nicht.

So können Sie tun dies mit Async Aufgabe:

var yourTask = AsyncTask() 

während Sie dies mit normaler Aufgabe tun können:

NormalTask().someFunction() 
5

Beiden Methoden geben selber Typen: Task. Aber async Methode ermöglicht es, await Schlüsselwort in seinem Körper zu verwenden. Es informiert den Compiler, um die Zustandsmaschine für await und all dessen zu erzeugen. Über asynchrone/erwarten Leistung können Sie lesen this post

+0

Aber beide Methoden sind asynchron, oder? –

+0

Ja, das sind sie. Darüber hinaus können Sie 'erwarten' mit jeder Methode (async und nicht async) verwenden. – g4s8