我正在尝试使用 ReadAllBytesAsync 读取多个二进制文件。为什么带有 Task.Run() 的版本(如下所示)的速度几乎是没有的版本的两倍。我期待 ReadAll1 方法与 ReadAll2 等效。
test2.bin 是 test1.bin 的副本(每个大约 100 MB)
方法 | 平均 | 错误 | 标准差 | 已分配 |
---|---|---|---|---|
ReadAll1 | 81.57 毫秒 | 1.385 毫秒 | 1.942 毫秒 | 199.37 MB |
ReadAll2 | 44.55 毫秒 | 1.041 毫秒 | 3.021 毫秒 | 199.37 MB |
public static async Task ReadAll1()
{
var tasks = new List<Task>();
tasks.Add(File.ReadAllBytesAsync(@"test1.bin"));
tasks.Add(File.ReadAllBytesAsync(@"test2.bin"));
await Task.WhenAll(tasks);
}
public static async Task ReadAll2()
{
var tasks = new List<Task>();
tasks.Add(Task.Run(() => File.ReadAllBytesAsync(@"test1.bin")));
tasks.Add(Task.Run(() => File.ReadAllBytesAsync(@"test2.bin")));
await Task.WhenAll(tasks);
}
在你的第二个版本中,你正在安排你的任务在线程池上运行,可能会导致并行执行。而第一个版本可能在同一个线程上执行。您可以通过查看 Task.Run 函数中的
Thread.CurrentThread.ManagedThreadId
来验证它。