Bazı asenkron/bekletme kodlarını zincirleme görevlere dönüştürüyorum, böylece yayımlanan çerçevede kullanabilirim. bekliyoruz koduTaskCompletionSource olmadan görev zinciri oluşturma?
Task<TraumMessage> Invoke(string verb) {}
Task<TraumMessage> Memorize() {}
Ben zincire Invoke
umuyordum ve Memorize
Memorize
tarafından üretilen görevi dönmek için bu
public async Task<TraumMessage> Get() {
var message = await Invoke("GET");
var memorized = await message.Memorize();
return memorized;
}
benziyor, ama bu bir Task<Task<TraumMessage>
sonuçlanır. i sona erdi ettik çözüm benim sinyali olarak bir TaskCompletionSource<TraumMessage>
geçerli: TaskCompletionSource
olmadan bunu yapmanın bir yolu
public Task<TraumMessage> Get() {
var completion = new TaskCompletionSource<TraumMessage>();
Invoke("GET").ContinueWith(t1 => {
if(t1.IsFaulted) {
completion.SetException(t1.Exception);
return;
}
t1.Result.Memorize().ContinueWith(t2 => {
if(t2.IsFaulted) {
completion.SetException(t2.Exception);
return;
}
completion.SetResult(t2.Result);
});
});
return completion.Task;
}
var mı?
Jon Skeet'in EduAsync serisi sayesinde, async/await'ın kapağının altına baktım ve temelde bir devlet makinesini çalıştıran bir sınıf oluşturuyor. Bu yaklaşımı daha önce de kullandım, ama TCS yaklaşımından bile daha sıkıcı. –
Ah, bunu daha çok düşündüm ve 2. görevin devam etmesinin sonucunu bekleyen 1. görevin devam etmesini engellemek istemediğiniz sürece saf sürekliliğin bir yolu yoktur. Eğer yıldızların çalınması hizalı olsaydı, bunun anlamı çok azdır, ama teorik olarak 2. görevin nasıl yaratıldığına dair bir fikriniz olmadığından (örneğin, tamamen farklı bir görev zamanlayıcısı veya APM olabilir) bunun için hiçbir garanti yoktur. Yani sonuçta bekleyen bir iş parçacığı engellediğini varsayalım. Neyi kastettiğimi görmek istiyorsan, cevapımı güncelleyeceğim. –
http://blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx adresinden Stephen Taub, 'TaskCompletionSource'u bu deseni uygulamak için' Sonra 'adlı yardımcı bir yöntemle tamamlar. – Govert