Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Async Await - Fatal编程技术网

C# 异步/等待多核

C# 异步/等待多核,c#,.net,async-await,C#,.net,Async Await,async/await是否应与线程一起使用以利用多核?我不完全理解async/await,但看起来它不创建新线程,也不使用线程池。因此,它在当前线程上运行代码,这意味着没有多核支持。如果您尝试这样使用async/await,它只会启动一个新线程,但不能用于在多核上运行某些东西。工作只是转移到另一个线程并释放当前线程 您可以使用类似PLINQ的东西在多核上工作 参考:根据: wait操作符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。这项任务是正在进行的工作 这就是它的全部功能。这

async/await是否应与线程一起使用以利用多核?我不完全理解async/await,但看起来它不创建新线程,也不使用线程池。因此,它在当前线程上运行代码,这意味着没有多核支持。

如果您尝试这样使用async/await,它只会启动一个新线程,但不能用于在多核上运行某些东西。工作只是转移到另一个线程并释放当前线程

您可以使用类似PLINQ的东西在多核上工作

参考:

根据:

wait操作符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成。这项任务是正在进行的工作

这就是它的全部功能。这与线程无关。它将在同一线程上开始执行其他操作,直到其他任务(而不是
任务
)完成。async/await还将改善单核系统的性能。

不是关于跨多核的负载平衡工作。它是关于利用本质上是异步的操作,并释放资源来处理更多的工作。好的异步API不使用额外的线程来执行工作。通常,这意味着代码将继续在同一线程上执行,直到命中第一个
wait
,并将控制权交还给调用者

您可以查看异步API的示例,例如
HttpClient
StreamWriter
SmtpClient
,等等。它们都通过网络处理工作(网络驱动程序调用、磁盘驱动器调用等)

如果您正在寻找的是并行处理,请查看该类


您也可以从阅读开始,在
wait
强制非并行执行中没有任何固有的内容。您可以轻松地启动多个任务,并行运行它们,并同时等待它们

await
确保
async
方法在活动的环境同步上下文中运行。这通常是倾向于强制非并行执行的事情。所有主流同步上下文都是非并行的。通过使用
Task.Run
,您可以随意突破该限制

也就是说,在GUI应用程序中,您不需要在UI线程上并行执行,因为您根本不应该在那里做太多工作

在服务器应用程序中,每个请求的同步上下文都是单线程的。这也是一个很好的默认值。不同的请求并行运行

var t1 = Task.Run(...);
await t1;
var t2 = Task.Run(...);
await t2;
再说一次,你可以随心所欲:

var t1 = Task.Run(...);
var t2 = Task.Run(...);
await t1;
await t2;
这是并行的

var t1 = Task.Run(...);
await t1;
var t2 = Task.Run(...);
await t2;

这是连续运行的。

Async/await本身与线程无关。它是关于暂停执行等待结果,并为其他代码释放资源。线程是该特性的外部功能:实现可能决定切换到另一个线程来执行任务。(和
Task.Run
也将使用线程池线程AFAIK。但它与异步/等待功能没有直接关系。)正确。这是关于IO池,而不是线程池。严格地说,async/await不会启动新线程,它是一个任务执行方法。@Vlad:好的,我重新编写了该部分以避免这种区别。@Vlad:还不够好吗?你真的认为答案有理由因为一个不相关的细节而投反对票吗?关于“async/await通常会启动一个新线程”的说法是不相关的?我读过一些文档中有相反的说法,所以至少对我来说是令人困惑的。我从来没有听说标准框架异步函数启动一个新线程,甚至一个新任务。它们通常是使用其他异步调用方式的IO方法,比如IOCP。如果没有线程,那么为什么下面问题的第二个答案中的C#示例演示了异步等待生成多个线程@AjaxLeung,因为在控制台应用程序中使用
Task.Delay
时,备份同步上下文的是线程池,它只是在任意线程上恢复执行。不会产生任何线程。请在WinForm应用程序中尝试相同的示例。