任务延迟会创建新的线程吗?
- 论坛
- 任务延迟会创建新的线程吗?
24 浏览
匿名的
0 Comments
Task.Delay不会调用Task.Run,在指定的时间间隔之后,它只会返回一个完成的Task,并在线程池中调用任何附加到它的延续。它在内部使用System.Threading.Timer实现。具体的实现如下所示:
public class Task { public static Task Delay(int millisecondsDelay) { var tcs = new TaskCompletionSource(); _ = new Timer(_ => tcs.SetResult(), null, millisecondsDelay, -1); return tcs.Task; } }
因此,当你使用await关键字等待Task.Delay时,await之后的延续会在与Timer回调被调用的同一线程上运行,这个线程恰好是线程池中的一个线程。
需要注意的是,上述实现只是一个示例,并非真正的实现,也不能保证正确工作。Timer实例没有被存储在任何地方,因此在回调被调用之前,它可能会被垃圾回收,导致Task永远不会完成。假设没有使用SynchronizationContext。