【问题标题】:Asynchronously calling synchronous I/O using TAP使用 TAP 异步调用同步 I/O
【发布时间】:2016-01-24 04:21:42
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    正如您所指出的,您可以使用 Task.Run 将其卸载到不同的线程,但这并不是更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2013-06-19
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多