Có Delay(0)
luôn luôn được gạch chân không? Theo kinh nghiệm của tôi, có nghĩa là:Task.Yield() so với 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();
}
}
}
Đây là ứng dụng giao diện điều khiển, do đó, nhóm chủ đề được sử dụng để tiếp tục. Kết quả:
Main thread: 11
after Yield(), thread: 7
after Delay(0), thread: 7
after Delay(100), thread: 6
Tuyệt vời, cảm ơn! Trông với tôi như một cách thuận tiện để tạo một nhiệm vụ không chung chung [trong trạng thái hoàn thành] (http://stackoverflow.com/a/18527377/1768303). Chấp nhận câu trả lời của Damien về mặt kỹ thuật anh ta là người đầu tiên:] – Noseratio
@Noseratio Tôi nghĩ rằng sử dụng một cái gì đó như 'Task complete = Task.FromResult (true);' là tốt hơn, bởi vì nó được đảm bảo để làm việc. Tôi nghĩ rằng 'Task.Delay (0)' không bắt buộc phải trả về một 'Task' đã hoàn thành. – svick
@svick, tôi đồng ý 'Task.FromResult (true)' thích hợp hơn, nhưng tôi vẫn thích 'Task.Delay (millisecondsDelay: 0)' vì tôi có thể dễ dàng mô phỏng cả việc đồng bộ và tiếp tục async chỉ bằng cách thay đổi 'millisecondsDelay'. Bạn có nghĩ rằng họ có thể thay đổi hành vi này? Điều đó trông giống như một sự thay đổi phá vỡ đối với tôi, đưa ra đoạn mã trên. – Noseratio