Lie*_*iel 14 .net c# async-await
什么是await外部应用程序创建文件最干净的方法?
async Task doSomethingWithFile(string filepath)
{
// 1. await for path exists
// 2. Do something with file
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*rvy 20
因此,第一个关键点是,FileSystemWatcher当文件系统事件在特定路径发生更改时,您可以使用a 来通知.例如,如果您希望在特定位置创建文件时收到通知,则可以找到答案.
接下来,我们可以创建一个方法,TaskCompletionSource当文件系统观察程序触发相关事件时,该方法使用a 来触发任务的完成.
public static Task WhenFileCreated(string path)
{
if (File.Exists(path))
return Task.FromResult(true);
var tcs = new TaskCompletionSource<bool>();
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(path));
FileSystemEventHandler createdHandler = null;
RenamedEventHandler renamedHandler = null;
createdHandler = (s, e) =>
{
if (e.Name == Path.GetFileName(path))
{
tcs.TrySetResult(true);
watcher.Created -= createdHandler;
watcher.Dispose();
}
};
renamedHandler = (s, e) =>
{
if (e.Name == Path.GetFileName(path))
{
tcs.TrySetResult(true);
watcher.Renamed -= renamedHandler;
watcher.Dispose();
}
};
watcher.Created += createdHandler;
watcher.Renamed += renamedHandler;
watcher.EnableRaisingEvents = true;
return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这首先检查文件是否存在,以允许它立即退出(如果适用).它还使用创建的和重命名的处理程序,因为任一选项都可以允许文件在将来的某个时刻存在.它FileSystemWatcher也只是监视目录,因此获取指定路径的目录然后检查事件处理程序中每个受影响文件的文件名很重要.
另请注意,代码在完成后会删除事件处理程序.
这允许我们写:
public static async Task Foo()
{
await WhenFileCreated(@"C:\Temp\test.txt");
Console.WriteLine("It's aliiiiiive!!!");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6820 次 |
| 最近记录: |