2013-03-22 22 views
15

Koşullu olarak bir görevi çalıştırmak isteyeceğim durumlar var. Böyle uzatma yöntemi çeşit kullanın:boş bir statik görevi TPL'de kötü bir uygulamada mı döndürüyor?

public static class MyTaskExtension{ 
    private static Task theEmptyTask = Task.Factory.StartNew(() => {}); //This is the question 

    public static Task ContinueWith(this Task task, Task continuationTask, Func<bool> condition) 
    { 
    if condition(){ 
     ... do the work 
    } 
    return theEmptyTask; 
    } 
} 

Benim beklentim ben sadece bu görevi iade bir şey yapmak istemiyorsanız theEmptyTask zaten null veya yeni yerine, yani temelde tamamlanmış olacağını ise boş görev

Bu yaklaşımla bir aksaklık olması gerektiğini hissediyorum. Bunu herkes görebilir mi?

+1

sen yerine 'kullanmasını sağlamak gibi bir kukla görevi başlamayın TaskCompletionSource'. –

+2

Ya da sadece Task.FromResult –

cevap

21

Zaten tamamlanmış bir görevi bazı durumlarda iade etmek kesinlikle kabul edilebilir. Özellikle sık sık yapılan bir şey değil, ama yapıldı.

Tek bir statik tamamlanmış görev kullanmakla yanlış bir şey de yoktur. Tamamlandığında, tamamen aynı olan, birbirini tamamlayan farklı görevlere sahip olmanıza gerek yoktur ve sonuç alınamadığı takdirde, bunları yeniden kullanmakta yanlış bir şey yoktur.

Zaten tamamlanmış bir görevi geri yüklemek isterseniz, boş bir yöntem oluşturmayacağınız, planladığınız, beklemediğiniz sürece, şimdi yaptığınızdan daha az yükü olan bir tane oluşturmak için Task.FromResult'u kullanabilirsiniz. Başlamak için ve sonra hemen bitirmek var. Sadece Task.FromResult(false) döndürerek size tamamlanmış bir görev verecektir.

Eğer kolayca yeterince kendi FromResult oluşturabilirsiniz .NET 4.0 kullanıyorsanız: bu yaklaşımı kullanmaya gidiyoruz

public static Task FromResult<T>(T result) 
{ 
    var tcs = new TaskCompletionSource<T>(); 
    tcs.SetResult(result); 
    return tcs.Task; 
} 
1

Tamamlanmış durumda olan bir görevi elinizde tuttuğunuz sürece (bunu kullanmak için TaskCompletionSource kullanın), bununla ilgili herhangi bir sorun olduğunu düşünemiyorum çünkü Task sınıfında gerçekten hiçbir belirleyici yok İstemcinin statik boş görevinizle karıştırmasına izin verin. Görevinizle ilgili Dispose() numaralı telefonu arayabilirler, ancak bunun herhangi bir zarara neden olacağını düşünmüyorum (örneğin, Görev'in özelliklerini denetleme yeteneğini etkilemeyeceğini düşünmüyorum (denemedim - test etmeye değecek bir şey) dışarı)).

+0

@downvoter, yorum yapmak ister misiniz? –

+1

Stephen Toub, [Task.Dispose()] konusunu ele alan bir makaleye sahiptir (http://blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx). – svick

+0

@svick, bağlantı için teşekkürler. Burada ilgili bir bölümden bahsediyoruz “İşleri, elden çıkarıldıktan sonra bile kullanılabilir hale getirdik. Artık Task'ın tüm kamu görevlilerini elden çıkarıldıktan sonra kullanabilirsiniz. –

İlgili konular