0

多数のプロセスを同時に実行できるマルチスレッド .NET アプリケーションを設計しようとしています。私はマルチスレッド アプリケーションの経験がなく、ここ数日、マルチスレッド アプリケーションについて読んでいます。これが私がしなければならないことです。一定の間隔で UDP ブロードキャスト データを「リッスン」する 2 つのプロセスを用意します。次に、ある間隔で最新のデータを送信する 3 番目のプロセスを作成します。現在、概念実証アプリケーションを構築しています。C# WinForms アプリケーションとしてビルドしています。私の考えは、最新のデータを保持するために使用するクラス インスタンスを用意し、ロックを使用して問題がないことを確認することです。

私のアプリケーションは一種の作品です。約 60 秒ほど実行されているように見えますが、その後、動作が停止します。エラーなどで実際に失敗することはありません。時々、送信を停止しているように見えることがあります。それ以外の場合、アプリケーションはエラーなしで終了します。マルチスレッド同期の問題か何かがあると思います。

単純化されたコードを次に示します。

public class MyData
{
  public string Field1 {get; set;}
  public string Field2 {get; set;}
}

public class myForm : Form
{
  private MyData _data = new MyData();
  readonly object _locker = new object();
  Thread _thread1;
  Thread _thread2;
  Thread _thread3;

  public myForm()
  {
    _thread1 = new Thread(new ThreadStart(Listener1));
    _thread2 = new Thread(new ThreadStart(Listener2));
    _thread3 = new Thread(new ThreadStart(Sender));

    _thread1.Start();
    _thread2.Start();
    _thread3.Start();
  }

  private void Listener1()
  {
    bool _done = false;
    while (!_done)
    {
      ...listen and get data...
      lock(_locker)
      {
        _data.Field1 = ...value...
      }
    }
  }

  private void Listener2()
  {
    bool _done = false;
    while (!_done)
    {
      ...listen and get data...
      lock(_locker)
      {
        _data.Field2 = ...value...
      }
    }
  }

  private void Sender()
  {
    string _dataToSend = "";
    bool _done = false;
    while(!_done)
    {
      Thread.Sleep(2000);
      lock(_locker)
      {
        _dataToSend = _data.Field1 + "," + _data.Field2;
      }
    }
    ...send _dataToSend...
  }
}

私が間違っているかもしれないことについて誰かが何か考えを持っていますか? この概念は正しいと思いますか? これと同じことを達成するためのより良い方法はありますか? クラス変数を使用してデータ (MyData) を保持する代わりに、別のスレッドからファイル システム上のファイルを読み書きした方がよいでしょうか?

ありがとう、コーリー

編集済み:スレッドを開始するコードを省略しました。

4

0 に答える 0