如何在C#控制台应用中创建监控文件大小的独立任务
解决方案:用System.IO类实现控制台文件监控与多任务写入
在控制台应用中,你可以直接使用System.IO命名空间下的FileInfo类来获取文件大小,完全不需要依赖WPF的FileIO类。以下是完整的实现示例,包含多任务写入GUID和独立监控任务的逻辑:
关键实现要点
- 用
FileInfo实时获取文件大小,每次查询创建新实例避免缓存旧值 - 多任务写入时通过
lock保证线程安全,防止文件写入冲突 - 用
CancellationTokenSource控制监控任务启停,避免无限循环
完整代码示例
using System; using System.IO; using System.Threading; using System.Threading.Tasks; class Program { static readonly string _filePath = "guids.txt"; static readonly object _writeLock = new object(); // 写入锁保证线程安全 static async Task Main(string[] args) { // 初始化文件(不存在则创建) if (!File.Exists(_filePath)) { using var stream = File.Create(_filePath); } // 创建取消令牌,用于停止监控任务 using var cts = new CancellationTokenSource(); // 启动监控任务 var monitorTask = Task.Run(async () => { while (!cts.Token.IsCancellationRequested) { try { var fileInfo = new FileInfo(_filePath); Console.WriteLine($"当前文件大小:{fileInfo.Length} 字节"); } catch (Exception ex) { Console.WriteLine($"监控出错:{ex.Message}"); } await Task.Delay(500, cts.Token); // 每隔0.5秒执行一次 } }, cts.Token); // 创建25个写入任务 var writeTasks = new Task[25]; for (int i = 0; i < 25; i++) { writeTasks[i] = Task.Run(() => { // 每个任务写入100个GUID(可按需调整数量) for (int j = 0; j < 100; j++) { lock (_writeLock) { File.AppendAllText(_filePath, $"{Guid.NewGuid()}{Environment.NewLine}"); } // 模拟写入间隔,避免瞬间完成 Thread.Sleep(10); } }); } // 等待所有写入任务完成 await Task.WhenAll(writeTasks); // 取消监控任务并等待其结束 cts.Cancel(); try { await monitorTask; } catch (OperationCanceledException) { Console.WriteLine("监控任务已停止"); } Console.WriteLine("所有写入任务完成,程序结束"); } }
代码说明
文件监控逻辑:
- 监控任务通过循环+
Task.Delay(500)实现定时查询 - 每次查询创建新的
FileInfo实例,确保获取最新文件大小 - 借助
CancellationToken在写入完成后优雅停止监控
- 监控任务通过循环+
多任务写入逻辑:
- 使用
lock锁定写入操作,避免多任务同时写入导致内容错乱或IO异常 - 每个任务循环写入指定数量的GUID,可根据需求调整写入量或逻辑
- 使用
异常处理:
- 监控任务捕获文件访问异常(如文件被其他进程占用)
- 处理监控任务的取消异常,避免程序崩溃
内容的提问来源于stack exchange,提问作者Brayden Chapple
相关产品推荐
相关产品推荐

