【问题标题】:How lock Console class properties so only one thread can access them at one time如何锁定控制台类属性,以便一次只有一个线程可以访问它们
【发布时间】:2017-05-06 21:20:10
【问题描述】:

我想在控制台的不同位置显示消息,但是当我尝试将光标位置设置为左 50、前 60 时,它在打印'A'、'B'之前发生了变化,因为还有另一个线程“th " 这也在不同位置的控制台上显示消息。因此它也在访问光标属性的左侧和顶部。 我想当 Man() 函数设置光标位置时,那个时候没有其他线程会改变它。

static void Main(string[] args)
    {
        Thread th = new Thread(() => new Program().Hello(50, 60));
        th.Start();
        new Program().Man();
    }   
    public void Hello(int left, int top)
    {
        int i = 0;
        Console.CursorLeft = left; Console.CursorTop = top;
        Console.ForegroundColor = ConsoleColor.DarkGreen;`
        Console.Write("Processing");
        while (true)
        {
            i = 0;
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            while (i < 20)
            {
                Console.Write("*");
                i++;
            }
            Console.ForegroundColor = ConsoleColor.Black;
            Console.Write("********************");
        }
    }

    public void Man()
    {
            Console.CursorLeft = 50;
            Console.CursorTop = 60;
            Console.Write("A");
            Console.Write("B");
            Console.Write("C");
            Console.Write("D");

    }

【问题讨论】:

  • 你到底想在这里完成什么?
  • 我想在控制台的不同位置显示消息,但是当我尝试将光标位置设置为 50,60 时,它在打印'A','B'之前发生了变化,因为还有另一个线程也在不同位置的控制台上显示消息。我想当 Man() 设置光标位置时,没有其他线程会改变它。
  • 您似乎将 CursorLeft 的位置更改了两次(先设置为 50,然后设置为 60),这可能是问题的根源吗?
  • 不不,这是拼写错误,抱歉。真正的问题是 Thread th = new Thread(() => new Program().Hello(50, 60));它正在改变光标的位置。一旦主线程访问它的属性,我想锁定控制台类,所以没有其他人访问它

标签: c# multithreading locking


【解决方案1】:

您的代码的问题是您通过“this”保留字锁定实例。由于您正在创建 Program 类的两个实例,因此“this”将引用两个不同的对象,因此它无法将一部分代码保留在外面,而另一部分已经在里面。

解决这个问题的一种方法是锁定一个静态对象。

更好的方法是优化你的代码。

【讨论】:

    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多