Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# 如何理解非IO绑定的异步代码_C#_.net_Asynchronous - Fatal编程技术网

C# 如何理解非IO绑定的异步代码

C# 如何理解非IO绑定的异步代码,c#,.net,asynchronous,C#,.net,Asynchronous,我在理解异步代码如何用于非IO操作方面存在差距。 对于IO,很明显没有创建线程,因为IO操作由网卡、HDD或其他东西控制。但是当我有一些长时间运行的方法时,我需要将其设置为Task.Run({method}),但是Task.Run()实际上是从池中创建/重新使用一个线程,在我看来执行是并行的-主线程和线程池线程,即使是纯CPU绑定的情况,异步/等待仍然有用: 并非所有的线程都是相等的;在客户端应用程序中,当其他工作在后台继续进行时,将UI线程释放回绘制和响应事件循环事件等工作是非常有益的;这可

我在理解异步代码如何用于非IO操作方面存在差距。
对于IO,很明显没有创建线程,因为IO操作由网卡、HDD或其他东西控制。但是当我有一些长时间运行的方法时,我需要将其设置为Task.Run({method}),但是Task.Run()实际上是从池中创建/重新使用一个线程,在我看来执行是并行的-主线程和线程池线程

,即使是纯CPU绑定的情况,
异步
/
等待
仍然有用:

  • 并非所有的线程都是相等的;在客户端应用程序中,当其他工作在后台继续进行时,将UI线程释放回绘制和响应事件循环事件等工作是非常有益的;这可以通过多种方式实现,其中之一是:
    async
    /
    wait
    ;或者,某些线程可能具有不同的优先级
  • 有时,您可以有效地并行化工作,无论是在工作线程执行工作时计算其他内容,还是在多个线程之间分割单个工作;在任何一种情况下,
    async
    /
    await
    都可以用于协调(“连接”)这些操作
  • 但是:如果这些场景不适用,并且您将线程间的工作推送到
    await
    it(不同时执行任何其他操作,也不需要任何特殊的线程条件),那么您只需要使用
    async
    /
    await

即使某些东西是纯CPU绑定的,
异步
/
等待
仍然有用:

  • 并非所有的线程都是相等的;在客户端应用程序中,当其他工作在后台继续进行时,将UI线程释放回绘制和响应事件循环事件等工作是非常有益的;这可以通过多种方式实现,其中之一是:
    async
    /
    wait
    ;或者,某些线程可能具有不同的优先级
  • 有时,您可以有效地并行化工作,无论是在工作线程执行工作时计算其他内容,还是在多个线程之间分割单个工作;在任何一种情况下,
    async
    /
    await
    都可以用于协调(“连接”)这些操作
  • 但是:如果这些场景不适用,并且您将线程间的工作推送到
    await
    it(不同时执行任何其他操作,也不需要任何特殊的线程条件),那么您只需要使用
    async
    /
    await

您的问题是什么?到目前为止你写的没有错…同意,看起来你理解得很好。我的问题是-为什么人们说异步代码不使用任何其他线程?我在Internet上看到的所有示例都是关于文件、HttpClient异步方法的。也许它们只意味着IO绑定的任务。@NickReshetinsky,那是因为它是泛化的东西;在许多(大多数?)情况下,
async
/
await
与线程无关;如果您使用
Task.Run
,则:是;这也不意味着它不能仍然有用!你的问题是什么?到目前为止你写的没有错…同意,看起来你理解得很好。我的问题是-为什么人们说异步代码不使用任何其他线程?我在Internet上看到的所有示例都是关于文件、HttpClient异步方法的。也许它们只意味着IO绑定的任务。@NickReshetinsky,那是因为它是泛化的东西;在许多(大多数?)情况下,
async
/
await
与线程无关;如果您使用
Task.Run
,则:是;这也不意味着它不能仍然有用!