public async Task <string> GetChangedFileAsync(CancellationToken cancellationToken) { foreach (var file in _fileSet) { _fileWatcher.WatchDirectory(Path.GetDirectoryName(file)); } var tcs = new TaskCompletionSource <string>(); cancellationToken.Register(() => tcs.TrySetResult(null)); Action <string> callback = path => { if (_fileSet.Contains(path)) { tcs.TrySetResult(path); } }; _fileWatcher.OnFileChange += callback; var changedFile = await tcs.Task; _fileWatcher.OnFileChange -= callback; return(changedFile); }