C# 调用异步方法是否立即运行其命令

C# 调用异步方法是否立即运行其命令,c#,async-await,task,task-parallel-library,C#,Async Await,Task,Task Parallel Library,我得到了这个密码: static async Task AsynchronousProcessing() { Task<string> t1 = GetInfoAsync("Task 1", 3); Task<string> t2 = GetInfoAsync("Task 2", 5); string[] results = await Task.WhenAll(t1, t2); foreach (string result

我得到了这个密码:

static async Task AsynchronousProcessing()
{  
    Task<string> t1 = GetInfoAsync("Task 1", 3);  
    Task<string> t2 = GetInfoAsync("Task 2", 5);  
    string[] results = await Task.WhenAll(t1, t2);  
    foreach (string result in results)  
    {    
      WriteLine(result);  
    }
}

static async Task<string> GetInfoAsync(string name, int seconds)
{  
    await Task.Delay(TimeSpan.FromSeconds(seconds));   
    return  "hi";
}
当到达行Task t1=GetInfoAsyncTask 1,3;,它是否已经与wait Task.DelayTimeSpan.FromSecondsseconds异步启动;然后转到方法的其余部分,或者它会立即返回任务而不实际启动它吗

如果调用方法时它不会启动,那么任务是否只会在调用任务时启动。Whallt1,t2?因为如果它不立即启动,我希望看到GetInfoAsync执行类似于returnnewtask=>

调用GetInfoAsync并像往常一样同步运行,直到它到达wait Task.DelayTimeSpan.fromsSeconds行。然后,它将未完成的任务返回给调用AsynchronousProcessing方法

因此,是的,当您调用该方法时,任务确实正在启动,也就是说,您不必等待GetInfoAsync调用该任务。延迟方法调用。

我建议阅读我的


总之,所有异步方法开始同步执行。因此,当AsynchronousProcessing调用GetInfoAsync时,GetInfoAsync开始同步运行,就像其他任何方法一样。当存在等待时,异步方法可以变为异步。在本例中,GetInfoAsync再次同步调用Task.Delay,就像常规方法调用一样,然后将其任务传递给wait。此时,等待将检查任务;如果已经完成,则将继续同步运行;否则,它将异步运行,并从GetInfoAsync返回一个不完整的任务

从异步方法返回的任务正在进行中。我通常不使用术语running,因为它们实际上没有在CPU上运行代码,而且任务状态也没有实际运行。即使它没有等待任何东西

因为如果它不立即启动,我希望看到GetInfoAsync执行类似于returnnewtask=>

async关键字处理任务的创建。如上所述,任务是热的或正在进行中。这与运行或启动不同,两者都意味着运行CPU代码的任务。从异步方法返回的是Promise任务

如果没有任何带有wait的新线程,那么它们将如何并行运行

它们并行运行,而不是并行运行,因为没有额外的线程阻塞延迟


但是,当等待任务时。延迟。。完成,则可能使用了另一个线程。等待将执行返回hi;在这方面。如果捕获的上下文是线程池上下文,那么将在线程池线程上执行这一行代码。异步状态机将返回转换为代码,以完成先前从该异步方法返回的任务。

因此,对于此方法,这两个任务是否并行运行?没有新线程?@YonatanNir:是的,第二次调用Task。延迟将在第一次调用GetInfoAsync返回未完成的任务并再次调用GetInfoAsync之后发生。如果在返回hi的行上放置一个断点,并使用相同的秒参数值调用这两个方法,则应注意,该断点将在秒后触发两次。关于同时运行的任务。。如果没有任何带有wait的新线程,那么它们将如何并行运行?@YonatanNir:Task.Delay启动计时器,并在计时器过期时完成返回的任务。对GetInfoAsync的实际调用实际上并不是并行运行的,因为它们几乎立即返回。但是计时器和Task.Delay任务是并行运行的。如果它已经完成,那么它将继续异步运行;-那是打字错误吗?从链接文章:等待检查,等待,看看它是否已经完成;如果等待已完成,则该方法将继续同步运行,就像常规方法一样。@ScottHannen:是的,这是一个输入错误。谢谢我不知道有什么不同,除非我最近读了这篇文章,这篇文章很有启发性。很好的异步介绍!我喜欢它。将帮助我提高我的知识,谢谢