Delay(0)
her zaman doğrulanmış mı? Benim deneyimime göre:Task.Yield() versus Task.Delay (0)
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Program
{
static async Task Test()
{
await Task.Yield();
Console.WriteLine("after Yield(), thread: {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(0);
Console.WriteLine("after Delay(0), thread: {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(100);
Console.WriteLine("after Delay(100), thread: {0}", Thread.CurrentThread.ManagedThreadId);
}
static void Main(string[] args)
{
Console.WriteLine("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);
Test().Wait();
}
}
}
Bu bir konsol uygulamasıdır, bu nedenle iş parçacığı havuzu devam etmek için kullanılır. çıkışı: Task.Delay
İçinde
Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
Harika, teşekkürler! Genel olmayan [görev tamamlanmış durumda] oluşturmak için kullanışlı bir yol gibi görünüyor (http://stackoverflow.com/a/18527377/1768303). Damien'ın cevabını teknik olarak kabul ederek ilk oldu:] – Noseratio
@Noseratio Görev bittiği gibi bir şey kullanmayı düşünüyorum = Task.FromResult (true); 'çalışmak daha iyi olduğu için daha iyidir. Bence Task.Delay (0) 'tamamlanmış bir' Task' iadesi yapmak zorunda değil. – svick
@svick, ben katılıyorum 'Task.FromResult (true)' daha uygun, ama ben hala '' milisaniyeDelay' değiştirerek hem eşitleme hem de uyumsuzluğu simüle edebileceğiniz gibi Task.Delay (milisaniyeDelay: 0) 'ı seviyorum. Bu davranışı değiştirebileceklerini düşünüyor musunuz? Bu, yukarıdaki kodu vererek, benim için bir kırılma değişikliği gibi görünecek. – Noseratio