C# 如何锁定控制台类属性,以便一次只有一个线程可以访问它们
我想在控制台的不同位置显示消息,但当我尝试将光标位置设置为左50,前60位时,它在打印“A”和“B”之前得到了更改,因为还有另一个线程“th”也在控制台的不同位置显示消息。因此它也在访问左上方的光标属性。 我想在Man()函数设置光标位置时,其他线程不会改变它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.
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类,这样就不会有其他线程访问它了