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

如何向现有解决方案添加可持续输出消息的常驻控制台项目?

可常驻运行的独立日志项目实现方案

方案1:控制台常驻方案(符合优先控制台输出的要求)

核心逻辑是不让控制台进程的Main方法执行结束,通过任务队列接收调用请求,同时阻塞主线程保持进程存活:

  • 控制台项目Main方法改造示例:
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace LogConsoleApp
{
    internal class Program
    {
        // 线程安全队列,存储WinForm端发来的执行请求
        private static readonly BlockingCollection<Action> _taskQueue = new BlockingCollection<Action>();

        static void Main(string[] args)
        {
            // 后台线程消费队列任务
            _ = Task.Run(() =>
            {
                foreach (var task in _taskQueue.GetConsumingEnumerable())
                {
                    try
                    {
                        task();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"[错误] {DateTime.Now:yyyy-MM-dd HH:mm:ss} {ex.Message}");
                    }
                }
            });

            // 阻塞主线程,直到收到结束信号才退出
            _taskQueue.WaitForComplete();
        }

        // 暴露给外部调用的通用任务入队方法
        public static void AddTask(Action task)
        {
            if (!_taskQueue.IsAddingCompleted)
            {
                _taskQueue.Add(task);
            }
        }

        // 封装好的日志打印方法,直接供WinForm项目调用
        public static void PrintLog(string logContent)
        {
            AddTask(() => Console.WriteLine($"[日志] {DateTime.Now:yyyy-MM-dd HH:mm:ss} {logContent}"));
        }

        // 提供停止控制台的方法,WinForm退出时调用
        public static void Shutdown()
        {
            _taskQueue.CompleteAdding();
        }
    }
}
  • WinForm端调用说明:
    • 右键解决方案 -> 添加项目引用,勾选控制台项目即可直接调用暴露的静态方法
    • 启动控制台进程时通过Process类启动,保存进程实例,WinForm关闭时联动调用Shutdown()方法再结束进程
    • 如果不需要严格跨进程隔离,可直接在WinForm项目中调用Win32 API AllocConsole() 直接附加控制台窗口,无需额外独立项目,直接调用Console.WriteLine()即可输出,实现成本最低

方案2:替代实现(独立日志窗口)

如果对日志展示有更多需求(比如搜索、导出、样式自定义),可以把独立项目做成WinForm类库/ WinForm应用:

  • 内置一个固定的日志窗口,用只读富文本框/文本框展示日志内容
  • 依托WinForm自带的UI消息循环即可保持进程常驻,不需要自己写阻塞逻辑
  • 暴露日志追加方法供主项目调用,灵活性远高于原生控制台

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:03