aep*_*eus 41 .net file-io asynchronous
你有异步版本的读写(开始/结束函数),但没有删除(我可以告诉).这有什么理由吗?是不是有很多理由像读/写一样异步删除?
使用线程来模拟异步行为与异步函数不同.差别很大,确定你得到了感知的并行处理,但它并没有真正阻止阻塞,其他线程仍然被阻止等待文件i/o完成.真正的异步函数(开始/结束函数)在系统级运行,它们排队文件i/o,让应用程序继续运行,并让应用程序知道它何时准备继续执行文件i/o(允许你在等待文件i/o可用时执行其他操作).
usr*_*usr 28
这将是有用的.如果在断开连接的网络共享上删除,则DeleteFile最多可能需要30秒.
原因可能是没有异步删除文件的本机函数.托管API通常是非托管API的包装器.
Mic*_*edy 14
这个怎么样:
public static class FileExtensions {
public static Task DeleteAsync(this FileInfo fi) {
return Task.Factory.StartNew(() => fi.Delete() );
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
FileInfo fi = new FileInfo(fileName);
await fi.DeleteAsync(); // C# 5
fi.DeleteAsync().Wait(); // C# 4
Run Code Online (Sandbox Code Playgroud)
Ale*_*nat 11
所述File类不暴露一个异步文件删除方法; 但是,通过使用FileStream该类,仍然可以利用所提供的 13 个构造函数重载中的一个特定来执行异步文件删除。以下代码将异步删除文件:
using (new FileStream(Path, FileMode.Open, FileAccess.Read, FileShare.None, 1, FileOptions.DeleteOnClose | FileOptions.Asynchronous)) ;
Run Code Online (Sandbox Code Playgroud)
我没有对它进行太多测试,因此您可能需要稍微修改用法。(FileShare.None如果在删除期间不应阻止其他线程访问文件,您可能希望更改为其他内容。)此外,由于此代码不返回 Task 的任何派生,因此使用该Task.Run方法运行它可能是有效的。基本上,它执行的文件删除实际上在 I/O 级别是异步的,因此在这种情况下将其卸载到线程池应该没问题。
小智 5
如果没有其他文件打开,则在关闭流时,打开FileStream带有FileOptions.DeleteOnClose将导致Windows删除文件。如果您已经打开a FileStream来进行异步读取/写入,这可能会对您有所帮助,尽管如果您需要等待删除完成也无济于事(尽管根据@JoelFan等待File.Delete完成,并不能保证文件实际上已被删除)。
有趣的是,在针对网络共享进行测试时,似乎像这样打开流而不执行任何操作比()快得多(约40%)File.Delete:
using (new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)) { }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14650 次 |
| 最近记录: |