2011-09-15 7 views
14

TaskCompletionSource.SetResult(...) zaten çağrılmışsa TaskCompletionSource.TaskContinueWith(...) yöntemini kullanmak güvenli midir? task.ContinueWith ayarlanır önce WebClient.DownloadStringCompleted olay zaten ateş eğerBir TaskCompletionSource.Task üzerinde ContinueWith yöntemini çağırmak güvenli midir (bunun için .SetResult denir)?

// this was written inside the question box, please excuse any silly errors and lack of error checking (I'm not near VS right now)... 

private WebClient _webClient = new WebClient(); 

public Task<string> GetExamplePage() { 

    var tcs = new TaskCompletionSource<string>(); 

    web.DownloadStringCompleted += (s, ea) => tcs.SetResult(ea.Result); 

    web.DownloadStringAsync(new URI(@"http://www.example.com/example.html")); 

    return tcs.task; 
} 

public void ProcessExamplePage() { 

    var task = GetExamplePage(); 

    Thread.Sleep(1000); 

    task.ContinueWith(t => Console.WriteLine(t.Result)); // *line in question* 
} 

Console.WriteLine(...) yürütmek Will:

Bu temel kod umarım soruyu çerçeveye yardımcı olacak?

MSDN bunu söylemek (Task.ContinueWith) sahiptir:

Task.ContinueWith Yöntem

akım görev tamamlanana kadar Görev o koşma nedeniyle tamamlar, ister yürütülmesi için planlanan olmayacaktır döndü

tamamlanmadı, işlenemeyen bir istisna nedeniyle hata oluştu, ya da iptal edilmek üzere erken çıkılıyordu .

Bu yöntem çağrılırsa ve görev zaten tamamlanmışsa ne yazık ki bu durum söz konusu değildir.

Sağladığınız bilgiler için şimdiden teşekkür ederiz! Evet

cevap

17

Evet, bu iyi olmalı, Devam Etme Bir önceki görevin tamamlanıp tamamlanmadığını kontrol ederse, eğer devam ederse hemen devam edecektir.

+2

Bu, yeni bir zaman uyumsuz işlem başlatır mı yoksa bu yalnızca eşzamanlı olarak devam edecek mi? "TaskCompletionSource" işlevi eşzamansız bir işlem başlatmadı. – annemartijn

+0

Güzel. Bununla ilgili belgelere bir gönderme yapmak harika olurdu. –

+0

@annemartijn Özgün görevin (veya sürdürmenin) TaskCreationOptions öğelerini belirleyip belirlemediğine bağlıdır. Çalıştırma DenetimleriAsenkronize olarak (veya GörevKontinguationOptions. Sürekliliği Eşzamansız Olarak Çalıştır) - bunlar yalnızca * süreklilikleri * için geçerlidir - - ve/veya devamın “TaskContinuationOptions” ifadesini belirleyip belirlemediğini (ExecuteSynchronously) (bu, devam eden bir durum için geçerlidir). –