为什么我更喜欢使用 API 异步函数而不是用 Task.Run 包装同步函数?
Why should I prefer using API async fucntions over wrapping synchronous ones with Task.Run?
我知道这段代码有区别:
var streamWriter = new StreamWriter("something.txt");
streamWriter.WriteAsync("text");
还有这个:
var streamWriter = new StreamWriter("something.txt");
Task.Run(()=> streamWriter.Write("text"));
第一个更有意义。
在不同的情况下,当我等待结果时,此代码:
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...
比这更有意义:
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...
我想使用内置异步 API 不仅在清晰度上更好,而且它实际上比 ThreadPool
更好、更有效地管理 ThreadPool
线程线程无缘无故等待。
对吗?
包含在 Task.Run
中的同步调用将在该操作期间阻塞线程池线程。真正的异步实现 will not.
特别是对于流,判断操作是否为 "truly asynchronous" 可能有点棘手。例如,网络流始终是真正异步的,内存流永远不是真正异步的,文件流只有在将特殊标志传递给它们的构造函数时才是真正异步的。
我知道这段代码有区别:
var streamWriter = new StreamWriter("something.txt");
streamWriter.WriteAsync("text");
还有这个:
var streamWriter = new StreamWriter("something.txt");
Task.Run(()=> streamWriter.Write("text"));
第一个更有意义。
在不同的情况下,当我等待结果时,此代码:
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...
比这更有意义:
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...
我想使用内置异步 API 不仅在清晰度上更好,而且它实际上比 ThreadPool
更好、更有效地管理 ThreadPool
线程线程无缘无故等待。
对吗?
包含在 Task.Run
中的同步调用将在该操作期间阻塞线程池线程。真正的异步实现 will not.
特别是对于流,判断操作是否为 "truly asynchronous" 可能有点棘手。例如,网络流始终是真正异步的,内存流永远不是真正异步的,文件流只有在将特殊标志传递给它们的构造函数时才是真正异步的。