尝试理解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
方式将文件写入文件系统吗?
答案 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响应和并行性方面的好处。在选择之前测试不同的场景。在其他情况下,使用单线程。