Действительно ли Delay(0)
всегда вставляется? По моему опыту, он:Task.Yield() в сравнении с 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();
}
}
}
Это консольное приложение, поэтому пул потоков используется для продолжения. Выход:
Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
Отлично, спасибо! Выглядит как удобный способ создания не-generic [задачи в завершенном состоянии] (http://stackoverflow.com/a/18527377/1768303). Принимая ответ Дэмиена, как технически он был первым:] – Noseratio
@Noseratio Я думаю, используя что-то вроде 'Задача завершена = Task.FromResult (true);' лучше, потому что она гарантированно работает. Я думаю, что 'Task.Delay (0)' не требуется возвращать завершенную «Задачу». – svick
@svick, я согласен 'Task.FromResult (true)' более уместно, но мне все еще нравится 'Task.Delay (миллисекунды Delay: 0)', так как я могу легко имитировать как синхронизацию, так и продолжение async, просто изменив «миллисекундыDelay». Как вы думаете, они могут изменить это поведение? Это было бы для меня изменением, давая приведенный выше код. – Noseratio