- 此问题在此处已有答案**:
How does Task.CurrentId work?(2个答案)
2天前关闭。
我在用C#
和.NET 7
测试一些与Task
相关的东西。我注意到Task.CurrentID
在await 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():**
1条答案
按热度按时间xdnvmnnf1#
有两种任务,我称之为委托任务和承诺任务。
委托任务执行(同步)代码;在
async
/await
沿着之前,委托任务是Task
的主要用例,一些API(包括StartNew
和CurrentId
)专为委托任务而设计,当与async
代码一起使用时,它们会产生令人惊讶的行为。承诺任务是未来的概念它们表示将来可能完成的某些操作。异步任务(例如从
async
方法返回的任务)是“承诺”任务。您遇到的大多数任务都是“承诺”任务。“承诺”任务与延续一起工作,虽然它们在某些情况下 * 可能 * 使用任务调度程序,但通常不会。“承诺”任务的延续可能有也可能没有CurrentId
(通常不会)。