Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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#_Asynchronous_Async Await_Task Parallel Library - Fatal编程技术网

C# 异步/等待在IO操作上做什么?

C# 异步/等待在IO操作上做什么?,c#,asynchronous,async-await,task-parallel-library,C#,Asynchronous,Async Await,Task Parallel Library,假设示例代码段: public async void writeDataOnFile (byte[] data, string filePath) { using(var fs = new FileStream(filePath)) { await File.WriteAsync(data,0,data.length); } } 我知道线程池中没有消耗后台线程,但会启动IO操作,并在最后通知线程 问题是:async/await如何理解WriteAsync是一个IO绑定的

假设示例代码段:

public async void writeDataOnFile (byte[] data, string filePath) {
   using(var fs = new FileStream(filePath)) {
      await File.WriteAsync(data,0,data.length);
   }
}
我知道线程池中没有消耗后台线程,但会启动IO操作,并在最后通知线程

问题是:async/await如何理解WriteAsync是一个IO绑定的方法而不是CPU绑定的方法

任何帮助都将不胜感激

问题是:async/await如何理解WriteAsync是一种IO方法而不是CPU方法

wait
关键字不关心它是IO绑定还是CPU绑定。它所关心的只是“电话”是可以等待的。有关更多详细信息,请参阅

请参见下面的示例,其中扩展方法返回一个
TaskAwaiter

public static class ThisWorks
{
    public static System.Runtime.CompilerServices.TaskAwaiter GetAwaiter(this Int32 millisecondsDue)
    {
        return TimeSpan.FromMilliseconds(millisecondsDue).GetAwaiter();
    }

    private static System.Runtime.CompilerServices.TaskAwaiter GetAwaiter(this TimeSpan timeSpan)
    {
        return Task.Delay(timeSpan).GetAwaiter();
    }
}
现在我们可以使用它来执行以下操作:

await 15;

有更好的例子,但至少这说明了这一点。

编译器根本不需要理解这一点。它只是在
File.WriteAsync
返回的任务完成时安排继续。它是如何完成的取决于
File.WriteAsync
的实现。对于一个或多个关于任务如何不关心某个内容是否受I/O或CPU限制的实际示例,如果您看一下它在何处显示了一个简单的示例,说明如何转换基于事件的操作(下载开始并在完成时通知),可能会有所帮助完成一项任务。WriteAsync也做了类似的事情,操作完成后,操作系统会在内部通知每个回调。此外,“线程池中不会消耗任何后台线程”。我不确定这句话是否正确,因为我从来没有特别关心过线程池,但我大约99%确定使用了后台线程。我觉得你可能从那句话中推断出了不正确的信息,不管它在技术上是否正确。并不是说wait特别关心这一点……根据我的经验,它确实倾向于使用后台线程,尽管您可以将线程数限制为1,如我在上所示,但如果您担心多个线程遇到竞争条件,则标题中提出的问题与正文中提出的问题略有不同。我相信其他人是根据身体里的问题来回答的。对于标题中的问题,答案涉及理解,以及它们与async/await的关系。