创建目录异步(不使用FileSystemWatcher)?

bra*_*roo 6 c# io async-await

如何使以下代码异步运行,而不必在线程池上创建额外的线程(换句话说,不用 Task.Run(...))?

Directory.CreateDirectory("\\host\someNetworkDirectory");
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想这样使用它:

async SomeMethod(){
    //...
    await Directory.CreateDirectoryAsync("\\host\someNetworkDirectory");
    // stuff to do after ensuring the directory exists
    //...
}
Run Code Online (Sandbox Code Playgroud)

我尝试了此答案(建议使用FileSystemWatcher),但不适用于文件夹。

Rom*_*kov 9

在操作系统层面,这个函数是严格同步的。WinAPI 只有两个创建目录的函数,CreateDirectoryCreateDirectoryEx. 它们都不接受回调。

因此,您无法避免必须创建线程来实现异步。您所能希望的最好的方法是找到一个可以将其隐藏起来的图书馆。


ILM*_*tan 5

查看静态 Task.Run 方法。

async SomeMethod() {
    //...
    await Task.Run(() => Directory.CreateDirectory("\\host\someNetworkDirectory"));
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • @MrinalKamboj 你误解了 Task.Run 或 TCS 的作用。没有什么是假包装。TCS 封装了其他异步 API 并将它们公开为 tatsk。TCS 本身不会做任何事情。代码仍将在原始线程上运行。 (5认同)
  • @MrinalKamboj 你误解了这些例子。TCS 用于包装其他 API,即 EAP(基于事件)或 APM(以回调开始/结束)。这是执行异步作业的其他 API。当该 API 完成时,*它* 会从它决定使用的任何线程向 TCS 发出信号。TCS 由原始线程创建和返回。如果您尝试将它与 CreateDirectory 结合使用,您仍然会阻塞原始线程。 (3认同)
  • @PanagiotisKanavos,同意,我没有误解,我知道 TCS 与基于事件的 API 的使用,只是这个问题和答案都具有误导性,这增加了我的困惑,正如您提到的“CreateDirectory”不需要“ Async` 根本不公开任何事件,它与链接中所示的“FileWatcher”不同,并且肯定将其包装在“Task”中,如答案所示肯定是一个糟糕的选择 (2认同)