如何在c#Console的同一列中按线程并排打印2个作品?

如何在c#Console的同一列中按线程并排打印2个作品?,c#,multithreading,console,console-application,thread-sleep,C#,Multithreading,Console,Console Application,Thread Sleep,节目又来了 正如你所看到的,我已经创建了两个具有工作循环的方法 并在main中创建了两个指向这些方法的线程,然后启动它们 输出结果是两个循环都像1一样工作,然后是空格和新行1,依此类推 但我想要的是让它们并排出现在同一行中,就像我们把一页分成两部分,然后用一行一行地写东西一样 我不想让他们分开工作,但在同一时间,在同一行,但不同的列 我知道可以通过在同一个控制台中写入两个对象来实现。wl但是我想通过这两个线程来实现 请提供有用的解决方案 谢谢 使用制度; 使用系统线程 class Program

节目又来了 正如你所看到的,我已经创建了两个具有工作循环的方法 并在main中创建了两个指向这些方法的线程,然后启动它们

输出结果是两个循环都像1一样工作,然后是空格和新行1,依此类推 但我想要的是让它们并排出现在同一行中,就像我们把一页分成两部分,然后用一行一行地写东西一样

我不想让他们分开工作,但在同一时间,在同一行,但不同的列

我知道可以通过在同一个控制台中写入两个对象来实现。wl但是我想通过这两个线程来实现

请提供有用的解决方案 谢谢

使用制度; 使用系统线程

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
都只是为了证明锁工作正常。您可以将它们全部删除,尤其是
控制台中的锁