如何在c#Console的同一列中按线程并排打印2个作品?
节目又来了 正如你所看到的,我已经创建了两个具有工作循环的方法 并在main中创建了两个指向这些方法的线程,然后启动它们 输出结果是两个循环都像1一样工作,然后是空格和新行1,依此类推 但我想要的是让它们并排出现在同一行中,就像我们把一页分成两部分,然后用一行一行地写东西一样 我不想让他们分开工作,但在同一时间,在同一行,但不同的列 我知道可以通过在同一个控制台中写入两个对象来实现。wl但是我想通过这两个线程来实现 请提供有用的解决方案 谢谢 使用制度; 使用系统线程如何在c#Console的同一列中按线程并排打印2个作品?,c#,multithreading,console,console-application,thread-sleep,C#,Multithreading,Console,Console Application,Thread Sleep,节目又来了 正如你所看到的,我已经创建了两个具有工作循环的方法 并在main中创建了两个指向这些方法的线程,然后启动它们 输出结果是两个循环都像1一样工作,然后是空格和新行1,依此类推 但我想要的是让它们并排出现在同一行中,就像我们把一页分成两部分,然后用一行一行地写东西一样 我不想让他们分开工作,但在同一时间,在同一行,但不同的列 我知道可以通过在同一个控制台中写入两个对象来实现。wl但是我想通过这两个线程来实现 请提供有用的解决方案 谢谢 使用制度; 使用系统线程 class Program
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);
}
}}
类程序
{
静态void Main(字符串[]参数)
{
线程t1=新线程(代码1);
螺纹t2=新螺纹(代码2);
t1.Start();
t2.Start();
}
静态无效代码1()
{
对于(int i=0;i您必须使用Console.SetCursorPosition(int left,int top)
方法,因此您可以从您想要的任何位置开始在Console
上写,也可以回到前面的行中
显然,您必须跟踪每个线程的位置,即该线程的当前行及其第一列。
在我的示例中,我创建了两个线程,一个线程的第一列位于位置0,第二个线程的第一列位于位置50。请注意需要写入的字符串的宽度,否则它们将在控制台上溢出自己的空间
另外,由于您是在多线程应用程序中执行此操作,因此需要在控制台上锁定。否则,假设:一个线程设置光标位置,然后另一个线程设置它,然后调度程序返回到第一个线程…第一个线程在第二个线程上写入e> 线程的位置
这是一个非常简单的控制台程序,它抓住了要点:
using System;
using System.Threading;
namespace StackOverflow_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);
}
}
}
}
使用系统;
使用系统线程;
控制台上的命名空间堆栈溢出\u 3\u多线程\u
{
班级计划
{
静态随机_Random=新随机();
静态void Main(字符串[]参数)
{
var t1=新线程(Run1);
var t2=新线程(Run2);
t1.Start();
t2.Start();
}
静态void Run1()
{
对于(int i=0;i<30;i++)
{
Thread.Sleep(_random.Next(2000));//用于测试
编写(“t1:+i.ToString(),0,i”);
}
}
静态void Run2()
{
对于(int i=0;i<30;i++)
{
Thread.Sleep(_random.Next(2000));//用于测试
ConsoleLocker.Write(“t2:+i.ToString(),30,i”);
}
}
}
静态类控制台
{
私有静态对象_lock=新对象();
公共静态无效写入(字符串s,左整数,上整数)
{
锁
{
控制台。设置光标位置(左、上);
Thread.Sleep(100);//用于测试
控制台。写入;
}
}
}
}
所有的线程.Sleep
都只是为了证明锁工作正常。您可以将它们全部删除,尤其是控制台中的锁