2016-08-02 102 views
0

我實現了一個連接多個客戶端的服務器。服務器讀取一個文本文件並將第一行發送到客戶端,等待6秒鐘併發送下一行,等等。現在我只想在點擊按鈕時發送一行。我怎麼做?c#每按一下按鈕一行一行讀取文件

在我的按鈕事件中,我把這個方法放在一個任務中,因爲服務器必須處理其他來自客戶端的連接請求。

服務器端:

private void SendFilesButton_Click(object sender, EventArgs e) 
    { 
     Task SendTask = Task.Factory.StartNew(() => SendFiles()); 
    } 


    public void SendFiles() 
    { 
     try 
     { 
      tcpClient = tcpListener.AcceptTcpClient(); 
      if (tcpClient.Connected) 
      { 

       using (StreamReader reader = new StreamReader("C:\\Users\\Chudnofsky\\Desktop\\Projekt\\Neu\\Messwerte.txt")) 
       { 

        lock (this) 
        { 
         string line; 
         for (int i = 1; i < 2400; i++) 
         { 
          line = reader.ReadLine() + Environment.NewLine; 
          stream = tcpClient.GetStream(); 
          byte[] toSend = Encoding.ASCII.GetBytes(line); 
          stream.Write(toSend, 0, toSend.Length); 
          stream.Flush(); 
          i++; 
          Thread.Sleep(6000); 
         } 

        } 

       } 

      } 

     } 
     catch (Exception) 
     { 

      System.Windows.Forms.MessageBox.Show("Datei konnte nicht gelesen werden!"); 
     } 
    } 

回答

2

有2層簡單的方法來做到這一點。


如果使用的是 File.ReadAllLines方法Messwerte.txt文件不改變之間的請求存儲在成員變量及其內容:

private string[] lines = File.ReadAllLines("C:\\Messwerte.txt"); 
private int nextLine = 0; 

然後改變這:

line = reader.ReadLine() + Environment.NewLine; 

向該:

line = lines[nextLine] + Environment.NewLine; 
nextLine++; 


或者你不必一次讀取都行,如果該文件是使用 File.ReadLines()方法生長更適合:

int lineCount = 0; 
foreach (var lineInFile in File.ReadLines("C:\\Messwerte.txt")) 
{ 
    if (lineCount == nextLine) { 
     line = lineInFile; 
     nextLine++; 
     break; 
    } 
    lineCount++; 
} 

正如@Slai指出的那樣,這裏是實現第二個理想的方式。方法:

line = File.ReadLines("C:\\Messwerte.txt").ElementAtOrDefault(nextLine++); 
+3

或結合這兩種方法'線= File.ReadLines( 「C:\\ Messwerte.txt」)ElementAtOrDefauld(nextLine ++);對於第n行' – Slai

+0

掃描文件每次有點昂貴。對於OP案例可能很小的文件來說可能是很好的。爲了很好的代碼,人們會寫一些異步迭代器。 –

+0

是的,我同意,第一種方法已經考慮到了性能。 –