2016-05-14 38 views
1

所以這裏是程序再次 就像你看到的我已經建立2種方法有一個工作循環 而在對這些方法主要指向創建2個線程,他們都開始我如何打印2線程在c#控制檯的相同列並排工作?

什麼失控的輸出是這兩個循環工作像1然後空間和在新行1等 但我想要的是讓他們並排出現在同一行線由於我們分2頁的一頁和寫東西的行

我做不想讓他們單獨工作,但在同一時間,並在同一行,但不同的列

我知道它可以通過寫在同一個控制檯.wl兩個對象進行來達到的,但我想這些2個線程這樣acheive它

請提供有價值的解決方案,將工作 由於使用系統

;使用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); 
} 
}} 

回答

1

您必須使用Console.SetCursorPosition(int left, int top)方法,這樣你就可以在Console寫從任何你想要的位置開始,也早在以前行。

顯然,您必須保留每個Thread的位置跟蹤。即,Thread的當前行及其第一列。 在我的示例中,我製作了2個線程,一個位於第一個位置,第二個位於第50位。請注意您需要寫入的字符串的寬度,否則它們會溢出自己的空間在Console

此外,由於您是在多線程應用程序中執行此操作,因此您需要鎖定Console。否則,假設:一個Thread設置CursorPosition,然後另一個Thread設置它,然後調度程序返回到第一個Thread ...第一個Thread寫在第二個Thread的位置!

這是一個非常簡單的控制檯程序,得到了一點:

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); 
      } 
     } 
    } 
} 

所有Thread.Sleep在那裏只是爲了證明鎖定效果很好。您可以刪除所有這些文件,尤其是ConsoleLocker中的文件。

相關問題