我如何在 C# 控制台的同一列中并排打印 2 个线程?
How Can i Print 2 Works by threads side by side in same column in c# Console?
又是这个程序
如您所见,我已经创建了 2 个带有工作循环的方法
并在 main 中创建了 2 个线程指向这些方法并启动了它们
输出的结果是两个循环都像 1 一样工作,然后是 space 并在新行 1 中,依此类推
但我想要的是让它们并排出现在同一行中因为我们将页面分成两部分并按行写东西
我不想让它们单独工作,但一次在同一行但不同的列
我知道可以通过在同一个控制台 .wl 中编写两个对象来实现,但我想通过这两个线程以这种方式实现
请提供有价值的解决方案
谢谢
正在使用系统;
使用 System.Threading;
class Program
{
static void Main(string [] args)
{
Thread t1 = new Thread(code1);
Thread t2= new Thread (code2);
t1.Start();
t2.Start();
}
static void code1()
{
for(int i=0;i<50;i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
static void code2()
{
for(int i=0;i<50;i++)
{
Console.WriteLine("/t/t"+i);
Thread.Sleep(1000);
}
}}
你必须使用Console.SetCursorPosition(int left, int top)
方法,所以你可以在Console
上从你想要的任何位置开始写,也可以回到前面的行。
显然,您必须跟踪每个 Thread
的位置。即 Thread
的当前行及其第一列。
在我的示例中,我创建了 2 个线程,一个线程的第一列位于位置 0,第二个线程的第一列位于位置 50。注意您需要编写的字符串的宽度,否则它们会溢出自己的 space 在 Console
.
此外,由于您是在多线程应用程序中执行此操作,因此需要锁定 Console
。否则,假设这样:一个 Thread
设置 CursorPosition
,然后另一个 Thread
设置它,然后调度程序 returns 到第一个 Thread
...第一个Thread
写在第二个Thread
的位置!
这是一个非常简单的控制台程序,明白了要点:
using System;
using System.Threading;
namespace Whosebug_3_multithread_on_console
{
class Program
{
static Random _random = new Random();
static void Main(string[] args)
{
var t1 = new Thread(Run1);
var t2 = new Thread(Run2);
t1.Start();
t2.Start();
}
static void Run1()
{
for(int i = 0; i < 30; i++)
{
Thread.Sleep(_random.Next(2000)); //for test
ConsoleLocker.Write("t1:" + i.ToString(), 0, i);
}
}
static void Run2()
{
for (int i = 0; i < 30; i++)
{
Thread.Sleep(_random.Next(2000)); //for test
ConsoleLocker.Write("t2:" + i.ToString(), 30, i);
}
}
}
static class ConsoleLocker
{
private static object _lock = new object();
public static void Write(string s, int left, int top)
{
lock (_lock)
{
Console.SetCursorPosition(left, top);
Thread.Sleep(100); //for test
Console.Write(s);
}
}
}
}
所有 Thread.Sleep
只是为了证明锁工作正常。您可以删除所有它们,尤其是 ConsoleLocker
.
中的那个
又是这个程序 如您所见,我已经创建了 2 个带有工作循环的方法 并在 main 中创建了 2 个线程指向这些方法并启动了它们
输出的结果是两个循环都像 1 一样工作,然后是 space 并在新行 1 中,依此类推 但我想要的是让它们并排出现在同一行中因为我们将页面分成两部分并按行写东西
我不想让它们单独工作,但一次在同一行但不同的列
我知道可以通过在同一个控制台 .wl 中编写两个对象来实现,但我想通过这两个线程以这种方式实现
请提供有价值的解决方案 谢谢
正在使用系统; 使用 System.Threading;
class Program
{
static void Main(string [] args)
{
Thread t1 = new Thread(code1);
Thread t2= new Thread (code2);
t1.Start();
t2.Start();
}
static void code1()
{
for(int i=0;i<50;i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
static void code2()
{
for(int i=0;i<50;i++)
{
Console.WriteLine("/t/t"+i);
Thread.Sleep(1000);
}
}}
你必须使用Console.SetCursorPosition(int left, int top)
方法,所以你可以在Console
上从你想要的任何位置开始写,也可以回到前面的行。
显然,您必须跟踪每个 Thread
的位置。即 Thread
的当前行及其第一列。
在我的示例中,我创建了 2 个线程,一个线程的第一列位于位置 0,第二个线程的第一列位于位置 50。注意您需要编写的字符串的宽度,否则它们会溢出自己的 space 在 Console
.
此外,由于您是在多线程应用程序中执行此操作,因此需要锁定 Console
。否则,假设这样:一个 Thread
设置 CursorPosition
,然后另一个 Thread
设置它,然后调度程序 returns 到第一个 Thread
...第一个Thread
写在第二个Thread
的位置!
这是一个非常简单的控制台程序,明白了要点:
using System;
using System.Threading;
namespace Whosebug_3_multithread_on_console
{
class Program
{
static Random _random = new Random();
static void Main(string[] args)
{
var t1 = new Thread(Run1);
var t2 = new Thread(Run2);
t1.Start();
t2.Start();
}
static void Run1()
{
for(int i = 0; i < 30; i++)
{
Thread.Sleep(_random.Next(2000)); //for test
ConsoleLocker.Write("t1:" + i.ToString(), 0, i);
}
}
static void Run2()
{
for (int i = 0; i < 30; i++)
{
Thread.Sleep(_random.Next(2000)); //for test
ConsoleLocker.Write("t2:" + i.ToString(), 30, i);
}
}
}
static class ConsoleLocker
{
private static object _lock = new object();
public static void Write(string s, int left, int top)
{
lock (_lock)
{
Console.SetCursorPosition(left, top);
Thread.Sleep(100); //for test
Console.Write(s);
}
}
}
}
所有 Thread.Sleep
只是为了证明锁工作正常。您可以删除所有它们,尤其是 ConsoleLocker
.