2016-04-22 21 views
14

İki (veya daha fazla) eşzamanlı olmayan ve bağımlı (ikincisi ikinciyi bitirmek için bitirmek zorunda) işlemlerden oluşan asenkron kod yazmanın en iyi/doğru yolunun ne olduğunu merak ediyordum.Ardışık bekletme Devam devam ediyor Devam bekliyor

zaman uyumsuz olan örnek/bekliyor: Devam ile

await RunFirstOperationAsync(); 
await RunSecondOperationAsync(); 

Örnek: Sen Eğer muhtemelen await kullanmak isterdim

await RunFirstOperationAsync() 
    .ContinueWith(t => RunSecondOperationAsync()); 
+2

Bakın [this] (http://stackoverflow.com/questions/8767218/is-async-await-keyword-equivalent-to-a-continuewith-lambda) SO tartışması –

cevap

15

.

ContinueWith bir takım sorunları vardır. Bunu kısa bir süre önce why StartNew is dangerous (daha önce aynı sorunların çoğunu paylaşan) daha önceki blog yazıma dayanan why ContinueWith is dangerous adresindeki blog yazımda açıklarım. Özellikle

:

  • ContinueWith

    iyi varsayılan TaskScheduler yok. Varsayılan görev zamanlayıcısı TaskScheduler.Current (TaskScheduler.Default değil) olup, geçerli SynchronizationContext üzerinde devam etmek istenirse elle yapılmalıdır.
  • ContinueWith, ideal olmayan varsayılan options'a sahiptir. Eşzamansız kod için en az DenyChildAttach ve ExecuteSynchronously'u istersiniz.
  • ContinueWith, bu sınırlamayı aşmak için genellikle ek bir Unwrap çağrısı gerektiren eşzamansız süreklilikleri anlamıyor.
  • ContinueWith, CancellationToken argümanını şaşırtıcı bir şekilde ele alır. Daha fazla in this blog post benim.

Bu argümanların tümü blog post on Task continuations numaralı telefonumda özetlenmiştir. await'un bu dezavantajları yoktur.