SORU
5 EKİM 2011, ÇARŞAMBA


C# 5/Bekleyen zaman Uyumsuz eşzamanlı**?

C# 5, ve belirli bir soru geldi yeni zaman uyumsuz şeyler düşünüyordum.

Anlıyorum o await anahtar kelime bir Hollandalı derleyici hile/sözdizimsel şeker uygulamak continuation passing nereye geri kalan yöntemdir kırık içine Task nesneler ve sıraya kadar olacak çalıştırmak için, ama nereye denetimi geri arama yöntemi.

Benim sorunum şu anda bu tek bir konu üzerindeki bütün olduğunu duydum. Bu zaman uyumsuz şeyler gerçekten Task nesneleri içine devamı kod dönüm ve daha sonra her görev önce tamamlandıktan sonra Application.DoEvents() arama sadece bir şekilde bir sonraki başlıyor anlamına mı geliyor?

Ya da ben bir şey eksik? (Sorunun bu kısmı retorik - kaçırıyorum farkındayımbir şey:) )

Şimdiden çok teşekkürler.

CEVAP
5 EKİM 2011, ÇARŞAMBA


eşzamanlıbirçok seçkin asychronous işlemleri herhangi bir zamanda ilerleme olabilir bu anlamda. Olabilir veya olmayabilirçok iş parçacıklı.

Varsayılan devamı için geri tarifesi "geçerli yürütme içeriği". "Geçerli yürütme içeriği SynchronizationContext eğer orada yok ise"SynchronizationContext.Current olarak tanımlanır olmayan null TaskScheduler.Current.

ConfigureAwait arayıp continueOnCapturedContext parametre false ileterek bu varsayılan davranışı geçersiz kılabilirsiniz. Bu durumda, devam eden yürütme içeriği için geri planlanır. Bu genellikle iş parçacığı havuzu iş parçacığı üzerinde çalıştırmak anlamına gelir.

Kütüphane kod yazıyoruz sürece, varsayılan davranış, istediğiniz tam olarak nedir. Win, WPF ve Silverlight (yani, tüm UI çerçeveler) devamı UI iş parçacığında yürütür ** 12, (ve güvenli bir şekilde UI nesneleri erişebilir) kaynağı. ASP.NET ayrıca sürmesini sağlayan SynchronizationContext doğru isteği bağlamında yürütür malzemeleri.

Diğer konuları (iş parçacığı havuzu iş parçacığı, Thread BackgroundWorker dahil) SynchronizationContext bir kaynağı yok. Uygulamalar Konsol ve varsayılan Win32 hizmetleri SynchronizationContext yok. Bu durumda, devamı havuzu iş parçacığı üzerinde çalıştırmak. Bu yüzden uygulama demoları 18*/async *kullanma 20*/ReadKey *bir çağrı vardır Konsol ya Task Wait bir engelleme.

Kendini ihtiyacın SynchronizationContext kullanabilirsiniz AsyncContext Nito.AsyncEx kütüphane; temelde sadece sağlar asyncuyumlu "ana döngü" ile bir SynchronizationContext. Uygulamalar Konsol için yararlı buluyorumve birim testleri(VS2012 artık yerleşik async Task birim testleri desteği) vardır.

SynchronizationContext, hakkında daha fazla bilgi için my Feb MSDN article bkz.

Hiçbir zaman DoEvents veya buna denk denir; bunun yerine, akış kontrolüverirve devamı (işlevini geri kalanı) geç çalıştırılması planlanıyor. Bu DoEvents eskiden olsaydı olurdu gibi yeniden kullanılabilirlik sorunları neden olmaz, çünkü çok daha temiz bir çözüm olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • majesticdubstep

    majesticdubs

    3 Kasım 2011
  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009
  • RickardRick

    RickardRick

    9 Mart 2007