Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步/等待单线程/某些线程_C#_Multithreading_Asynchronous_C# 7.2 - Fatal编程技术网

C# 异步/等待单线程/某些线程

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

我需要一个关于wait的正确用法的小规则。在.net core c#7.2中运行以下代码:

静态类程序
{
静态异步任务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);