2017-10-02 5 views
-2

C#UDPクライアントのログ.txtファイルは、ボタンのクリックと別のスレッドのデータを使用しています

UDPを開始/停止し、.txtファイルに書き込むためのボタンコントロールを備えたUDPリスナを持っていますが、後者はうまく動作しません。

beginInvokeは[button_start_writing_Click]スレッドに 'data'を送信して、ボタンをクリックしたときではなく、自分自身をトリガーします。

データがテキストボックスで継続的に受信されるようにしたら、txtファイルへのログ記録を開始する瞬間を選択するのはどうでしょう?

事前に感謝します。

public partial class Form1 : Form 
{ 

    private UdpClient Client; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button_start_Click(object sender, EventArgs e) 
    { 
     Client = new UdpClient(Convert.ToInt32(textBox_port.Text)); 
     Client.BeginReceive(DataReceived, null); 

     button_stop.Click += Button_stop_Click; 
    } 

    private void DataReceived(IAsyncResult ar) 
    { 
     IPEndPoint ip = new IPEndPoint(IPAddress.Any, Convert.ToInt32(textBox_port.Text)); 

     byte[] data; 
     try 
     { 
      data = Client.EndReceive(ar, ref ip); 

      if (data.Length == 0) 
       return; // No more to receive 
      Client.BeginReceive(DataReceived, null); 
     } 
     catch //(ObjectDisposedException) 
     { 
      return; // Connection closed 
     } 

     // Send the data to the UI thread 
     this.BeginInvoke((Action<IPEndPoint, string>)DataReceivedUI, ip, Encoding.UTF8.GetString(data)); 

     // Send the data to the writer thread 
     this.BeginInvoke((Action<IPEndPoint, string>)button_start_writing_Click, ip, Encoding.UTF8.GetString(data)); 

    private void button_start_writing_Click(object sender, EventArgs e) 
    { 
     string logfilePath = "C:\\Users\\I4T\\Desktop\\Test Output\\"; 
     File.AppendAllText(logfilePath + "logtest.txt", "[" + DateTime.Now.ToString("dd-MM-yyyy hh:mm:ss.fff") + "] " + data); 
    } 
+0

何を望むかの詳細を見つける必要があり、あなたはそのが働いていない理由を確認するために追跡することができるはずです。あなたは何が間違っているのかを定義していません。あなたの「書き始め」は定義されていない "データ"をダンプするだけで、このコードは明らかにコンパイルできません。 – BugFinder

+0

申し訳ありません。 button_start_writing_ BeginInvokeをクリックします。おそらく、私がそれに近づいている方法は最高ではありません。私はbutton_start_writing_Clickスレッドにデータを(beginInvokeを使用して)ダンプしています。しかし、残念なことに、残念ながら、トップスレッドのbeginInvokeは、 'Start Writing'ボタンをクリックするのではなく、txtファイルスレッドへの書き込みをトリガーしています。これを達成するためのよりよい方法の提案はありますか? – Jon

+0

あなたが言ったので - これまでのところ単純なロジック/デザインの問題以上のものはありません – BugFinder

答えて

0

[OK]これはコメントには長すぎるが、完全なコードを与えるわけではありません。あなたのコードが何をすべきか、部分的にそのは常にファイルにダンプを呼び出すために行くので...

-

現在、あなたのコードはちょっと右ではなく右のすべてが同時にある

make connection 
while data arrives 
    write to text box 
    write to file 
end 

を語りますは

make connection 
while data arrived 
    write to text box 
    if file logging is wanted write this data to end of file 
end 

button- toggle the logging. 

だからどうすればいいですか? あなたができることのログがあり、おそらく他のものよりも「正常」と思われるものがあります。あなたの基本的な質問に固執し、このコードを栄光にする方法ではなく、私の2番目のコードセットにifが気づいた。

これはすべて、何らかの形式で、ブール値のFileLoggingを追加し、次にボタンを押すと!FileLoggingに変わります。

あなたの行動は送信者、eventargsではなく文字列にする必要があります。そのため、ファイルへの書き込みをオン/オフに切り替えることができます(必要に応じてログの開始/終了を追加できます)。実際にロギングを行った時期を制御します。

次にあなたがこれはコードの完全な最小セットをイマイチあなたは

関連する問題