Aracılığıyla paylaş


Task.FromResult tekil döndürebilir

Task.FromResult<TResult>(TResult) artık her zaman yeni bir örnek oluşturmak yerine önbelleğe alınmış Task<TResult> bir örnek döndürebilir.

Eski davranış

Önceki sürümlerde, Task.FromResult<TResult>(TResult) türüne T veya sonuç değerine bakılmaksızın her zaman yeni Task<TResult>bir ayırırdı.

Yeni davranış

Bazı T türler ve bazı sonuç değerleri için, Task.FromResult<TResult>(TResult) yeni bir nesne ayırma yerine önbelleğe alınmış tekil bir nesne döndürebilir. Örneğin, her çağrısının Task.FromResult(true) aynı zaten tamamlanmış Task<bool> nesneyi döndürmesi olasıdır.

Sürüm kullanıma sunulmuştur

.NET 6

Hataya neden olan değişikliğin türü

Bu değişiklik ikili uyumluluğu etkileyebilir.

Değişiklik nedeni

Birçok geliştiricinin, bu tür bir önbelleğe alma işlemi gerçekleştiren zaman uyumsuz yöntemlere benzer şekilde davranması beklenir Task.FromResult<TResult>(TResult) . Ayırma davranışını bilen geliştiriciler genellikle bu yaygın olarak kullanılan değerler için her zaman ayırmanın performans maliyetini önlemek için kendi önbelleklerini korurdu. Örneğin:

private static readonly Task<bool> s_trueTask = Task.FromResult(true);

Artık ve gibi küçük Int32 değerler için bu tür Boolean özel önbellekler gerekli değildir.

Bir örneğin başka bir TaskTask örnekle aynı olup olmadığını denetlemek için başvuru eşitliği kullanmıyorsanız, bu değişiklik sizi etkilememelidir. Böyle bir başvuru eşitliği kullanıyorsanız ve bu denetime devam etmeniz gerekiyorsa, her zaman benzersiz Task<TResult> bir örneği geri almayı garanti etmek için aşağıdaki kodu kullanın:

private static Task<T> NewInstanceFromResult<T>(T result)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.TrySetResult(result);
    return tcs.Task;
}

Not

Bu desen yalnızca kullanmaktan Task.FromResult(result)çok daha az verimlidir ve gerçekten ihtiyacınız olmadığı sürece bundan kaçınılmalıdır.

Etkilenen API’ler