如何在 C#.NET 中跨线程锁定控制台?

2023-11-27

我有一个logger处理各种带有漂亮颜色的信息显示的类(是的。)。但是,由于它写入控制台分开的步骤 (即,将颜色设置为红色,写入文本,将颜色设置为灰色,写入文本,以便呈现“[错误]描述...”,错误为红色),但我有一个多线程应用程序,因此这些步骤可能会混淆并以随机颜色打印随机内容。

我知道lock关键字,但是它不适用于静态类,例如控制台。

如果我不清楚的话,这里是一些示例代码:

using System;
using System.Text;

    namespace N.Utilities.IO
    {
        public static class Logger
        {
            private static void WriteColored(string value, ConsoleColor color)
            {
                if (Logger.UseColor)
                {
                    Console.ForegroundColor = color;
                    Console.Write(value);
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
                else
                {
                    Console.Write(value);
                }
            }   

            private static void WriteLineColored(string value, ConsoleColor color)
            {
                if (Logger.UseColor)
                {
                    Console.ForegroundColor = color;
                    Console.WriteLine(value);
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
                else
                {
                    Console.Write(value);
                }
            }

            private static bool useColor = true;

            public static bool UseColor
            {
                get
                {
                    return Logger.useColor;
                }
                set
                {
                    Logger.useColor = value;
                }
            }

            public static void Inform(string value)
            {
                Logger.WriteColored("    [Info] ", ConsoleColor.White);
                Console.WriteLine(value);
            }

            public static void Warn(string value)
            {
                Logger.WriteColored(" [Warning] ", ConsoleColor.Yellow);
                Console.WriteLine(value);
            }

            public static void Error(string value)
            {
                Logger.WriteColored("   [Error] ", ConsoleColor.Red);
                Console.WriteLine(value);
            }
    }

你的班级需要:

private static readonly object ConsoleWriterLock = new object();

然后您可以在写入控制台之前锁定它。

lock(ConsoleWriterLock)
{
     //Your code here
}

lock 关键字将与静态类一起使用,您只需提供一个static readonly要锁定的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C#.NET 中跨线程锁定控制台? 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • Magento 中保存“特价”的表格在哪里?

    我尝试使用 mySQL 和 php 脚本批量更新 Special price 和 price 我知道包含 price 的表和行 但不知道包含 special price 的表和行 我查看了数据库本身 但仍然没有运气 有任何想法吗 我需要表名
  • android.permission.WRITE_SETTINGS 是否仅授予系统应用程序?

    我们目前正在开发一个应用程序 我们希望在其中更改一些系统设置 当然需要用户许可 android 文档说要执行此操作 您必须添加以下权限
  • 如何使用 C# 对齐 ListView 中单个子项的文本?

    我无法在任何地方找到这个看似简单的主题的答案 是否可以在 WinForms ListView 控件中对齐单个子项的文本 如果是这样 怎么办 我希望同一列中的文本以不同方式对齐 例子 listView1 Columns 1 TextAlign
  • Android Chrome window.onunload

    我正在开发一个 HTML5 应用程序专门针对 Android 和 Chrome 我遇到的问题源于跟踪打开的浏览器选项卡的要求 我通过创建存储在每个选项卡的 sessionStorage 中的唯一 ID 来实现此目的 然后 我通过在每个选项卡
  • 更改了vhost并在CouchDB中重写,无法访问内部API

    我想将我的自定义域映射到设计文档 rewrite Configuration vhosts www myapp com myapp design user rewrite Rewrites from to static browser in
  • HashSet contains() 方法

    我执行下面的代码 发现输出是false import java util Set import java util HashSet public class Name private String first last public Nam
  • 正在运行的 Docker 容器何时会耗尽磁盘空间?

    我已经阅读了很多文档 但我仍然不确定这到底是如何工作的 这有点像 Docker 与 VM 的问题 如果我启动一个带有 2GB 硬盘的虚拟机并用文件填充其磁盘 我知道它会在 2GB 文件后耗尽 Docker 的工作方式相同吗 我想是这样 但从
  • 浮点数转二进制

    我正在尝试将浮点数转换为二进制表示形式 我怎样才能做到这一点 然而 我的目标是不限于 2m 因此我希望能够轻松扩展到任何基础 3 4 8 ecc 到目前为止 我对整数有一个简单的实现 import string LETTER 0123456
  • Django - 如何设置空白= False,必需= False

    我有一个这样的模型 class Message models Model msg models CharField max length 150 我有一个用于插入字段的表格 实际上 django 允许空白 例如 如果我在字段中插入一个空格
  • 如何查询 Npgsql.EntityFrameworkCore 中具有 JSON 数组的列

    Notes 使用 Npsql EntityFrameworkCore PostgreSQL v3 1 4 使用 Npgsql v4 1 3 1 使用代码优先方法 I have the following table called Cars
  • 如何避免键盘打开时jetpack撰写内容上升

    如上所示 当用户打开键盘时 项目列表 文本输入字段和添加按钮都会上升 我希望项目列表保持在原位 而文本输入字段和添加按钮则按原样上升 code 活动 class MainActivity ComponentActivity override
  • 与 SQL Server 建立连接时发生网络相关或特定于实例的错误

    我在 azurewebsites 上有一个简单的 mvc 网站 使用 VS internet 模板 与同一数据中心的 SQL Azure 数据库进行通信 此时的数据库只是做内置的SimpleMembership Provider 我已经从默
  • FFmpeg:在 Android Q 上无法使用文件描述符进行查找

    鉴于公共文件路径通常在具有范围存储的 Android Q 中不可用 我试图弄清楚如何使我的 FFmpeg 音频解码器使用文件描述符 而不将文件复制到我的应用程序的私有目录 我们可以使用中描述的方法轻松获取文件描述符Android Q 隐私更
  • 释放 GLKTextureLoader 分配的纹理(GLKTextureInfo 对象)

    对于 iOS 开发新手 尤其是 iOS 5 上的新 OpenGL 相关功能 如果我的问题非常基本 我深表歉意 我正在开发的应用程序旨在接收相机帧并通过 OpenGL ES 将它们显示在屏幕上 图形人员将接管此操作并添加我知之甚少的实际 Op
  • 像 PHP 一样使用 Request.Form 处理 HTML 输入元素数组

    我怎样才能在asp net上正确接收这些输入数组
  • jQuery 1.9.1 $.event.handle.apply 替代品

    我最近将我的一个项目更新到 jQuery 1 9 1 我无法再使用 event handle apply 方法 我搜索并发现 我可以放置jquery migrate js 我只是想确认一下是否还有其他选择 我的 google fu 在这里失
  • MongoDB GridFs用C#,如何存储图像等文件?

    我正在开发一个以 mongodb 作为后端的网络应用程序 我想让用户将图片上传到他们的个人资料中 例如链接的个人资料图片 我正在使用带有 MVC2 的 aspx 页面 并且我读到 GridFs 库用于将大型文件类型存储为二进制文件 我到处寻
  • ActionName 的目的

    使用 ActionName 属性为操作方法设置别名有什么好处 在为用户提供使用其他名称调用操作方法的选项方面 我确实没有看到它有多大好处 指定别名后 用户只能使用别名调用操作方法 但如果这是必需的 那么为什么用户不更改操作方法的名称而不是为
  • 当 reshape 无法猜测时变变量的名称时,重塑 r 中的数据

    我有一个包含超过 1500 列的宽格式数据集 由于许多变量都是重复的 我想将其重塑为长形式 然而 r 抛出一个错误 Error in guess varying Failed to guess time varying variables
  • 如何在 C#.NET 中跨线程锁定控制台?

    我有一个logger处理各种带有漂亮颜色的信息显示的类 是的 但是 由于它写入控制台分开的步骤 即 将颜色设置为红色 写入文本 将颜色设置为灰色 写入文本 以便呈现 错误 描述 错误为红色 但我有一个多线程应用程序 因此这些步骤可能会混淆并