Czy zawsze ma się wbudowany znak Delay(0)
? Z mojego doświadczenia, to robi:Task.Yield() kontra 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();
}
}
}
Jest to aplikacja konsoli, dzięki czemu pula wątek służy do kontynuacji. Wyjście:
Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
Świetne, dzięki! Wygląda mi to na poręczny sposób tworzenia nietypowego [zadania w stanie ukończonym] (http://stackoverflow.com/a/18527377/1768303). Przyjmując odpowiedź Damiena, technicznie był pierwszy:] – Noseratio
@Noseratio Myślę, że używając czegoś w stylu 'Zadanie zakończone = Zadanie.Zasilanie (prawda);' jest lepsze, ponieważ gwarantuje działanie. Myślę, że 'Task.Delay (0)' nie jest wymagane, aby zwrócić zakończone 'zadanie'. – svick
@svick, Zgadzam się z 'Task.FromResult (true)' jest bardziej odpowiednie, ale nadal lubię 'Task.Delay (millisecondsDelay: 0)' ponieważ mogę łatwo symulować kontynuację synchronizacji i asynchronizacji tylko przez zmianę 'millisecondsDelay'. Czy myślisz, że mogą zmienić to zachowanie? To byłoby dla mnie przełomowe, dając powyższy kod. – Noseratio