Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何锁定控制台类属性,以便一次只有一个线程可以访问它们_C#_Multithreading_Locking - Fatal编程技术网

C# 如何锁定控制台类属性,以便一次只有一个线程可以访问它们

C# 如何锁定控制台类属性,以便一次只有一个线程可以访问它们,c#,multithreading,locking,C#,Multithreading,Locking,我想在控制台的不同位置显示消息,但当我尝试将光标位置设置为左50,前60位时,它在打印“A”和“B”之前得到了更改,因为还有另一个线程“th”也在控制台的不同位置显示消息。因此它也在访问左上方的光标属性。 我想在Man()函数设置光标位置时,其他线程不会改变它 static void Main(string[] args) { Thread th = new Thread(() => new Program().Hello(50, 60)); th.

我想在控制台的不同位置显示消息,但当我尝试将光标位置设置为左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");

    }
static void Main(字符串[]args)
{
threadth=新线程(()=>newprogram().Hello(50,60));
th.Start();
新程序().Man();
}   
public void Hello(左整数,上整数)
{
int i=0;
Console.CursorLeft=left;Console.CursorTop=top;
Console.ForegroundColor=ConsoleColor.DarkGreen`
控制台。写入(“处理”);
while(true)
{
i=0;
Console.ForegroundColor=ConsoleColor.DarkGreen;
而(i<20)
{
控制台。写(“*”);
i++;
}
Console.ForegroundColor=ConsoleColor.Black;
控制台。写“*******************”;
}
}
公众虚空人()
{
Console.CursorLeft=50;
Console.CursorTop=60;
控制台。写入(“A”);
控制台。写入(“B”);
控制台。写入(“C”);
控制台。写入(“D”);
}

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

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


更好的方法是优化代码。

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

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


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

您到底想在这里实现什么?我想在控制台的不同位置显示消息,但当我尝试将光标位置设置为50,60时,它在打印“A”之前发生了更改,“B”,因为还有另一个线程也在控制台的不同位置显示消息。我想当Man()设置光标位置时,没有其他线程会更改它。看起来您将光标的位置更改了两次(先将其设置为50,然后再设置为60),这可能是问题的根源吗?不,不,这是打字错误,抱歉。真正的问题是threadth=newthread(()=>newprogram().Hello(50,60));它正在改变光标的位置。我想在主线程访问其属性时锁定console类,这样就不会有其他人访问它了。您到底想在这里实现什么?我想在控制台的不同位置显示消息,但当我尝试将光标位置设置为50,60时,它在打印“A”之前得到了更改,“B”,因为还有另一个线程也在控制台的不同位置显示消息。我想当Man()设置光标位置时,没有其他线程会更改它。看起来您将光标的位置更改了两次(先将其设置为50,然后再设置为60),这可能是问题的根源吗?不,不,这是打字错误,抱歉。真正的问题是threadth=newthread(()=>newprogram().Hello(50,60));它正在改变光标的位置。我想在主线程访问其属性时锁定console类,这样就不会有其他线程访问它了