.net 为什么任务.延迟后任务.当前ID变为空?[重复]

4sup72z8  于 2022-12-24  发布在  .NET
关注(0)|答案(1)|浏览(122)
    • 此问题在此处已有答案**:

How does Task.CurrentId work?(2个答案)
2天前关闭。
我在用C#.NET 7测试一些与Task相关的东西。我注意到Task.CurrentIDawait Task.Delay(1000);之后变成了Null。但是如果我用Thread.Sleep(),它就不会变成null。我不明白为什么?

    • 我的理解**:我知道Task.Delay()返回一个新的Task,在其上应用await将暂停进一步的执行,当延迟结束时,控制将移动到下一行,在该行上,我有Console.WriteLine("Task ID# " + Task.CurrentId);,此语句应该有Task.CurrentId值,因为控制再次返回到调用任务...或者我理解错了?
internal class Program
{
    static async Task Main(string[] args)
    {
   
        await Task.Run( SomeMethod);

        /*var tsk =  Task.Factory.StartNew(async () => await SomeMethod());
        await tsk.Result;*/

        Console.WriteLine("======END======");
        Console.Read();
    }

    static async Task SomeMethod()
    {
        Console.WriteLine("Task ID# " + Task.CurrentId);
        Console.WriteLine("Thread ID# " + Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("Is Thread Pool?# " + Thread.CurrentThread.IsThreadPoolThread);
        
        Console.WriteLine("======Loop started======");

        while (true)
        {
            await Task.Delay(1000);
            //Thread.Sleep(1000);  if i use this then Task.CurrentId is not null

            Console.WriteLine("Task ID# " + Task.CurrentId);
            Console.WriteLine("Thread ID# " + Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine("Is Thread Pool?# " + Thread.CurrentThread.IsThreadPoolThread);
        }
    }
}
    • 输出:**

    • 带线程. Sleep():**

xdnvmnnf

xdnvmnnf1#

有两种任务,我称之为委托任务和承诺任务。
委托任务执行(同步)代码;在async/await沿着之前,委托任务是Task的主要用例,一些API(包括StartNewCurrentId)专为委托任务而设计,当与async代码一起使用时,它们会产生令人惊讶的行为。
承诺任务是未来的概念它们表示将来可能完成的某些操作。异步任务(例如从async方法返回的任务)是“承诺”任务。您遇到的大多数任务都是“承诺”任务。“承诺”任务与延续一起工作,虽然它们在某些情况下 * 可能 * 使用任务调度程序,但通常不会。“承诺”任务的延续可能有也可能没有CurrentId(通常不会)。

相关问题