为什么我更喜欢使用 API 异步功能而不是用 Task.Run 包装同步功能?

Yuv*_*hap 1 c# asynchronous threadpool task-parallel-library async-await

我知道这段代码之间有区别:

var streamWriter = new StreamWriter("something.txt");
streamWriter.WriteAsync("text");
Run Code Online (Sandbox Code Playgroud)

和这个:

var streamWriter = new StreamWriter("something.txt");
Task.Run(()=> streamWriter.Write("text"));
Run Code Online (Sandbox Code Playgroud)

第一个更有意义。

在不同的情况下,当我等待结果时,此代码:

var streamReader = new StreamReader("something.txt")
char[] chars = new char[10];

Task<int> task = streamReader.ReadAsync(chars, 0, chars.Length);
//Do something...

int num = await task;
//Do something with num...
Run Code Online (Sandbox Code Playgroud)

比这更有意义:

var streamReader = new StreamReader("something.txt")
char[] chars = new char[10];

Task<int> task = Task.Run(()=>streamReader.Read(chars, 0, chars.Length));
//Do something...

int num = await task;
//Do something with num...
Run Code Online (Sandbox Code Playgroud)

我想使用内置的异步 API 不仅在清晰度上更好,而且它实际上ThreadPool比让ThreadPool线程无故等待更好、更有效地管理线程。

这样对吗?

Ste*_*ary 5

包装在 a 中的同步调用将在Task.Run该操作期间阻塞线程池线程。真正的异步实现不会

特别是对于流,确定操作是否“真正异步”可能有点棘手。例如,网络流总是真正的异步,内存流从来都不是真正的异步,而文件流只有在您将特殊标志传递给它们的构造函数时才是真正的异步。