2010-12-07 8 views
7

Task.Factory.ContinueWhenAll()'u birkaç kez şimdi, yalnızca tüm öncüller herhangi bir hata veya iptal olmaksızın tamamlanıncaya kadar devam etmek amacıyla kullanmaya çalıştım. Bunu yapmak,A ve B sonra görev C ile devam etmek için tek bir TPL yöntemi kullanılarak hata veya iptal olmadan tamamlanmak mümkün mü?

Birden görevlerin kapalı devamından için spesifik devam türlü dışlamak için geçersiz, mesajla atılmasına bir ArgumentOutOfRangeException neden olur. Parametre adı: continuationOptions

Örneğin

, kod

var first = Task.Factory.StartNew<MyResult>(
    DoSomething, 
    firstInfo, 
    tokenSource.Token); 
var second = Task.Factory.StartNew<MyResult>(
    DoSomethingElse, 
    mystate, 
    tokenSource.Token); 
var third = Task.Factory.ContinueWhenAll(
    new[] { first, second }, 
    DoSomethingNowThatFirstAndSecondAreDone, 
    tokenSource.Token, 
    TaskContinuationOptions.OnlyOnRanToCompletion, // not allowed! 
    TaskScheduler.FromCurrentSynchronizationContext()); 

TPL için kabul edilebilir değildir. Başka bir TPL yöntemini kullanarak böyle bir şey yapmanın bir yolu var mı?

cevap

4

Bunu yapmak için doğrudan bir yol yok gibi görünüyor. OnlyOnRanToCompletion - için hiçbiri değiştirerek ve Özel Durum durumunun devam edip geçmediğini kontrol ederek bu işlemin etrafından geçtim.

private void DoSomethingNowThatFirstAndSecondAreDone(Task<MyResult>[] requestTasks) 
{ 
    if (requestTasks.Any(t => t.Exception != null)) 
     return; 

    // otherwise proceed... 
} 

eser gibi bir şey, ama bu model tek vaka Task.Factory.ContinueWith kullandığı ile birden öncülleri ve sonları ile davayı işlemek için çok tatmin edici bir yol olarak görünmüyor.

İlgili konular