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
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 async
uyumlu "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.
Eşzamanlı olarak zaman uyumsuz bir işl...
Arama Javascript Fonksiyonu Eşzamanlı ...
Ne zaman uyumsuz bir Görev<T> yö...
Ne zaman uyumsuz bir yöntem oluşturmak...
Nasıl C zaman Uyumsuz bir Yöntem oluşt...