2010-11-22 17 views
100

Bir yöntem Task<Result> StartSomeTask() uygularım ve yöntemin çağrılmasından önce sonucun ne olduğunu öğreniyorum. Zaten tamamlanmış bir Task<T> nasıl oluştururum?Tamamlanan bir görev oluşturma <T>

private readonly Result theResult = new Result(); 

public override Task<Result> StartSomeTask() 
{ 
    var task = new Task<Result>(() => theResult); 
    task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); 
    return task; 
} 

daha iyi bir çözüm var mı:

Bu şu anda ne yapıyorum? .NET 4.5 hedeflerken

+6

Not Bu soruya cevap da Görev çünkü devralır Görev kısımdan düz Görevi (hayır ) oluşturmak için sadece iyi çalışır. –

cevap

102
private readonly Result theResult = new Result(); 

public override Task<Result> StartSomeTask() 
{ 
    var taskSource = new TaskCompletionSource<Result>(); 
    taskSource.SetResult(theResult); 
    return taskSource.Task; 
} 
162

sen Task.FromResult kullanabilirsiniz:

public static Task<TResult> FromResult<TResult>(TResult result); 

başarısız bir görev oluşturmak için kullanın Task.FromException: Bir non gerekirse

public static Task FromException(Exception exception); 
public static Task<TResult> FromException<TResult>(Exception exception); 

.NET 4.6 Task.CompletedTask ekler jenerik Task. .NET eski sürümleri için

public static Task CompletedTask { get; } 

Geçici Çözümler:

  • Async Hedefleme Paketi (veya AsyncCTP) içeren .NET 4.0 hedefleme yerine TaskEx.FromResult kullanabilirsiniz.

  • Task önce .NET 4.6 için, sen Task<T>Task kaynaklanmaktadır ve sadece Task.FromResult<object>(null) veya Task.FromResult(0) çağrı gerçeğini kullanabilirsiniz olmayan jenerik almak için.

+13

Genel olmayan bir görev döndürmek için, Task.FromResult (0) gibi bir şey kullanmak daha iyidir. "Null" parametresini parametre olarak kullanmak, jenerik parametreyi belirleyemeyen derleyiciyi karıştırır. – Whyllee

+0

İstisnalar nedir? Eşzamansız yöntemler, istisnaları yakalayan ve bunları geri dönen Görev'e kaydeden durum makinesine derlenir. Bu, ilk beklemeden önce kod yürütme için bile olur. Görev .FromResult döndürme yöntemi istisnaları doğrudan atabilir. –

+0

@ RobertVažan İlginç bir kenar örneği. Muhtemelen, eğer _known sonucunu bir yöntemden alıyorsanız ve bu yöntem istisnalar atarsa, o zaman düzeltilmesi gereken bir kusur vardır. – Gusdor

1

Rx kullanıyorsanız, bir alternatif Gözlemlenebilir.Return (sonuç) .ToTask().

12

Dönüş değeri olmayan görevler için, .NET 4.6, Task.CompletedTask'u ekledi.

TaskStatus.RanToCompletion'da zaten bulunan bir görevi döndürür. Muhtemelen her seferinde aynı örneği geri verir, ancak belgeler bu gerçeğe güvenmemeniz konusunda sizi uyarır.

0

Görev Çağrısı.Herhangi bir parametresi olmadan, tamamlanmış bir görevi döndürür.

Task task = Task.WhenAll(); 
İlgili konular