You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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("所有写入任务完成,程序结束");
    }
}

代码说明

  1. 文件监控逻辑:

    • 监控任务通过循环+Task.Delay(500)实现定时查询
    • 每次查询创建新的FileInfo实例,确保获取最新文件大小
    • 借助CancellationToken在写入完成后优雅停止监控
  2. 多任务写入逻辑:

    • 使用lock锁定写入操作,避免多任务同时写入导致内容错乱或IO异常
    • 每个任务循环写入指定数量的GUID,可根据需求调整写入量或逻辑
  3. 异常处理:

    • 监控任务捕获文件访问异常(如文件被其他进程占用)
    • 处理监控任务的取消异常,避免程序崩溃

内容的提问来源于stack exchange,提问作者Brayden Chapple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:40:25