void OnChanged(object sender, FileSystemEventArgs e) { Task.Factory.StartNew( () => { var info = new FileInfo(e.FullPath); int retryCount = 0; do { var timeout = 500 + retryCount * 100; Thread.Sleep(timeout); if (++retryCount > 30) { _logger.Error( "Failed after {RetryCount} retries to Open File {FileInfo}", retryCount, info); break; } }while (!info.CanReadFile()); return(info); }).ContinueWith(r => OnNewMessage(new NewMessageEventArgs(new MessageEntry(r.Result)))); }