2016-08-02 17 views
0

複数のクライアントに接続するサーバーを実装しました。サーバーはテキストファイルを読み取り、最初の行をクライアントに送信し、6秒待って次の行を送信します。ボタンがクリックされた場合にのみ、行を送信したいと思います。それ、どうやったら出来るの?c#ボタンごとにファイルを1行ずつ読む

私のボタンイベントでは、サーバーはクライアントからの他の接続要求を処理する必要があるため、このメソッドをタスクに入れました。

サーバー側:

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つの簡単な方法があります。


Messwerte.txtファイルには、要求間で変更されない場合は File.ReadAllLines方法を使用してメンバ変数にその内容を格納します。

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()メソッドを使用して成長している場合は、すべての行を読み取るために持っていけない方が適している:@Slaiで指摘したように

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

、ここでこの第二のを実装するための理想的な方法です。方法:

+3

line = File.ReadLines("C:\\Messwerte.txt").ElementAtOrDefault(nextLine++); 
または両方の方法を組み合わせる 'ライン= File.ReadLines( "C:\\ Messwerte.txt")ElementAtOrDefauld(nextLine ++)、n番目のラインのための ' – Slai

+0

スキャンファイル毎に多少高価です。 ..おそらくファイルが小さくなる可能性があるOPの場合は問題ありません。良いコードのために、ある種の非同期イテレータを書くでしょう。 –

+0

ええ、私は同意する、最初の方法は、パフォーマンスを念頭に置いている。 –

関連する問題