使用TAP异步调用同步I / O.

时间:2016-01-23 19:38:59

标签: c# .net asynchronous async-await task-parallel-library

我有一段代码必须尽可能高效地删除潜在的大量文件。我目前有以下函数为每个文件调用:

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);

1 个答案:

答案 0 :(得分:0)

如果您的基础操作是同步的,那么您无法将其变为异步。您需要一个不同的异步API,但它不一定必须基于任务,因为您可以将任何类型的异步API转换为TAP。

您可以按照指出将Task.Run卸载到其他线程,但效率不高。

相关问题