任务延迟会创建新的线程吗?

24 浏览
0 Comments

任务延迟会创建新的线程吗?

我想问一下Task.Delay是否在底层调用了Task.Run,并且这是否是线程ID更改的原因,还是背后有不同的逻辑?

0
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。

0