使用 TAP 异步调用同步 I/O
本文关键字:同步 调用 TAP 异步 使用 | 更新日期: 2023-09-27 18:31:32
我有一段代码必须尽可能高效地删除潜在的大量文件。 我目前有以下函数为每个文件调用:
private void deleteLocalFile(string Root, string RelativePath)
{
string FilePath = Path.Combine(Root, RelativePath);
File.SetAttributes(FilePath, File.GetAttributes(FilePath) & ~FileAttributes.ReadOnly);
File.Delete(FilePath);
}
我可以用 Task.Run() 包装它,但我知道最好将其主要用于 CPU 密集型任务,而此示例主要是 I/O 密集型的。 而且我找不到此类场景的最佳实践示例。
我大概会调用它的异步版本(支持进度和取消),如下所示:
List<Task> DeleteTasks = new List<Task>();
for (string RelativePath in SomeListOfRelativePaths)
{
DeleteTasks.Add(deleteLocalFileAsync(RootPath, RelativePath, Progress, CancellationToken);
}
Task.WaitAll(DeleteTasks);
如果基础操作是同步的,则无法将其转换为异步操作。您需要一个不同的异步 API,但它不一定是基于任务的,因为您可以将任何类型的异步 API 转换为 TAP。
正如您所指出的,您可以使用Task.Run
将其卸载到不同的线程,但这并不高效。