以下两种情况都会导致 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)
执行的操作。