如何向现有解决方案添加可持续输出消息的常驻控制台项目?
可常驻运行的独立日志项目实现方案
方案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
相关产品推荐
相关产品推荐

