使用 Task.Delay 或 Task.Run 启动任务的区别



以下两种情况都会导致 for 循环在它自己的线程上运行。 在 for 循环完成之前,它们都不会标记为完成。

class Program
{
static async Task SomethingAsync()
{
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
Console.WriteLine("s11{0}  {1}", i, Thread.CurrentThread.ManagedThreadId);
}
);
}
static async Task SomethingAsync2()
{
await Task.Delay(1);
for (int i = 0; i < 100; i++)
Console.WriteLine("s22{0}  {1}", i, Thread.CurrentThread.ManagedThreadId);
}
static void Main(string[] args)
{
var t1 = SomethingAsync();
var t2 = SomethingAsync2();
for (int i = 0; i < 300; i++)
Console.WriteLine("m{0}  {1}  {2}  {3}", i, Thread.CurrentThread.ManagedThreadId,t1.IsCompleted,t2.IsCompleted);
}
}

有什么功能差异吗? (除了明显的延迟(

在SomethingAsync2((的情况下,Task.Delay是我错误地发现的。 await 可以调用任何返回 GetAwaiter 的方法吗?

由于控制台应用程序没有同步上下文,因此将始终将延续计划到线程池线程。

但是,如果存在同步上下文(如在 Windows 窗体、WPF、UWP 等中(,则延续将发布到捕获的同步上下文。

请参阅配置等待常见问题解答。

顺便说一下,Task.Yield()在不涉及计时器的情况下执行您尝试用Task.Delay(1)执行的操作。

相关内容

最新更新