C# 异步/等待单线程/某些线程
我需要一个关于wait的正确用法的小规则。在.net core c#7.2中运行以下代码:C# 异步/等待单线程/某些线程,c#,multithreading,asynchronous,c#-7.2,C#,Multithreading,Asynchronous,C# 7.2,我需要一个关于wait的正确用法的小规则。在.net core c#7.2中运行以下代码: 静态类程序 { 静态异步任务GetTaskAsync(int超时) { WriteLine(“任务线程:+Thread.CurrentThread.ManagedThreadId”); 等待任务。延迟(超时); 返回timeout.ToString(); } 静态异步任务Main() { Console.WriteLine(“主线程:+Thread.CurrentThread.ManagedThreadI
静态类程序
{
静态异步任务GetTaskAsync(int超时)
{
WriteLine(“任务线程:+Thread.CurrentThread.ManagedThreadId”);
等待任务。延迟(超时);
返回timeout.ToString();
}
静态异步任务Main()
{
Console.WriteLine(“主线程:+Thread.CurrentThread.ManagedThreadId”);
Console.WriteLine(“应大于5000”);
等待值班(非平行);
Console.WriteLine(“应小于5000”);
等待值班(平行);
}
公共静态异步任务并行()
{
var res1=GetTaskAsync(2000);
var res2=GetTaskAsync(3000);
Console.WriteLine(“结果:+await res1+await res2”);
}
公共静态异步任务NotParallel()
{
var res1=等待GetTaskAsync(2000);
var res2=等待GetTaskAsync(3000);
控制台写入线(“结果:+res1+res2”);
}
专用静态异步任务监视(Func Func){
var sw=新秒表();
sw.Start();
等待func?.Invoke();
sw.Stop();
Console.WriteLine(“运行时间:+sw.ElapsedMilliseconds”);
Console.WriteLine(“--------------”);
}
}
正如大家所看到的,这两种方法的行为是不同的。在实践中很容易出错。所以我需要一个“拇指法则”
真人版更新请运行代码。请解释为什么Parallel()比NonParallel()运行得更快
在调用
GetTaskAsync
而不调用await
时,实际上会得到一个包含要执行的方法(即GetTaskAsync
)的任务。但是,当调用wait GetTaskAsync
时,执行将暂停,直到方法执行完毕,然后获得结果
让我更清楚地说:
var task = GetTaskAsync(2000);
这里,任务的类型为task
这里的结果类型为string
因此,要解决您的第一个疑问:何时等待任务实际上取决于您的执行流程
现在,关于为什么Parallel()
更快,我建议您阅读本文(所有内容都很有趣,但对于您的特定示例,您可以跳到任务返回“hot”)
现在让我们把它分解一下:
wait
关键字用于在任务完成之前暂停代码,
但实际上并没有启动它
在您的示例中,NotParallel()
将花费更长的时间,因为您的任务一个接一个地按顺序执行。文章解释道:
这是由于内联等待的任务造成的
在Parallel()
中,但是
这些任务现在并行运行。这是因为所有[任务]
在随后等待所有[任务]之前启动,因为
他们回来时很热
关于“热门”任务
我建议您阅读以下内容:
此处的任务状态部分有助于理解冷任务和热任务的概念:
由公共任务构造函数创建的任务称为冷任务,因为它们在非计划创建状态下开始其生命周期,并且仅在对这些实例调用Start时才计划
所有其他任务在热状态下开始其生命周期,这意味着它们所表示的异步操作已经启动
我邀请您广泛阅读async/await
和任务
。除了我上面提供的资源之外,这里还有一些资源:
您的问题到底是什么?更新了……。您是否在寻找类似“只有在一项任务依赖于另一项任务时才按顺序等待任务”的东西?问题是什么还不清楚。朱哈尔-这似乎是一个很好的解释。请把它移到回答中你要什么“经验法则”<代码>任务是指如果您等待它,它可能会产生结果。在那之前,它只是一个什么都不做的物体。在你的
非并行
方法中,直到第一个任务产生,你甚至没有第二个任务,所以当然这些方法是完全不同的。
var task = GetTaskAsync(2000);
var result = await GetTaskAsync(2000);