了解异步 - 我可以等待同步方法吗?

时间:2015-11-21 13:54:54

标签: c# .net asynchronous io async-await

尝试理解C#中的async-await,并且可能会陷入“鸡蛋和鸡蛋”问题。

async方法是否需要调用另一个async才能使其异步?

作为一个高级示例,我正在尝试对文件系统进行简单的写入,但不确定如何使这个任务等待,如果有的话。

public Task<FileActionStatus> SaveAsync(path, data)
{
    // Do some stuff, then...

    File.WriteAllBytes(path, data); // <-- Allow this to yield control?

    // ... then return result
}

在我试图异步的方法中调用那行代码。因此,在编写文件时,我想对应用程序进行控制,但不太确定如何执行此操作。

有人可以通过一个非常高级的示例来启发我,我可以用async方式将文件写入文件系统吗?

2 个答案:

答案 0 :(得分:7)

  

异步方法是否需要调用另一个async才能使其异步?

通常就是这种情况,因为async一直到调用堆栈的底部,并在实际进行IO操作的最低位置结束。在您的情况下,您使用的是<?php include 'path/to/php-html-css-js-minifier.php'; ob_start('minify_html'); ?> <!-- HTML code goes here ... --> <?php echo ob_get_clean(); ?> 阻止同步通话。你不能神奇地使它异步。

  

有人可以通过一个非常高级的示例来启发我,我将如何以异步方式将文件写入文件系统吗?

为此,您需要使用一种公开异步API的机制,例如FileStream

File.WriteAllBytes

答案 1 :(得分:-1)

除了Yuval回答:如果您的课程没有任何异步方法,您可以使用Task.Run在后台线程上运行该方法,这样您的代码可能如下所示:

public Task<FileActionStatus> SaveAsync(path, data)
{
  return Task.Run<FileActionStatus>(() =>
    {
      File.WriteAllBytes(path, data);
      // don't forget to return your FileActionStatus
    });
}

更新:线程占用资源。三思而后行如何使用它们。同步操作的异步包装可以为您提供至少在UI响应和并行性方面的好处。在选择之前测试不同的场景。在其他情况下,使用单线程。