如何锁定Console类属性,这样一次只有一个线程可以访问它们

时间:2017-05-06 21:20:11

标签: c# multithreading locking

我想在控制台的不同位置显示消息,但是当我尝试将光标位置设置为左侧50,前60时,它会在打印之前进行更改' A'' B& #39;因为还有另一个线程" 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");

    }

1 个答案:

答案 0 :(得分:3)

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

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

更好的方法是优化代码。