現在、ネットワークストリーミングソースに基づいてリストボックスを継続的に更新しようとしているWPFプロジェクトに取り組んでいます。スレッドを回避するためにWPF MainWindowメソッドを終了させる方法はありますか?
initializeComponent()
メソッドは、MainWindow()
メソッドが終了すると、実際にはWPFウィンドウしか表示されません。しかし、サーバーからの更新信号を継続的にリッスンし、適切な値でリストボックスを更新するために、while(true)
ループを内部に入れようとしています。
それぞれのメソッドは正常に動作していますが、それはwhileループのために現在のフォームでWPFウィンドウを開かないということだけです。リストボックスのスレッド "所有権"をスレッドに渡すために機能を実装する必要があることを認識しているので、リストボックスを更新するためにバックグラウンド更新スレッドを使用しないようにしようとしています。これを行う方法について確かめてください。
必要な機能を実現するために、欠落していることが判明していますか?次のように
コードは次のとおり
public MainWindow()
{
TcpClient client = new TcpClient();
client.Connect(serverAddress, port);
NetworkStream stream = client.GetStream();
numberOfPumps = 0; //initialize as 0 on startup.
handshake(stream);
InitializeComponent();
updatePumpList(stream);
updateListBox();
while(true)
{
updatePumpList(stream);
updateListBox();
}
}
updateListBox()
方法は、単に辞書からリストボックスに項目を追加しています。
private void updateListBox()
{
foreach(KeyValuePair<string, PumpItem> kvp in pumpDict)
{
pumpListBox.Items.Add(kvp.Key + ": " + kvp.Value.state);
}
}
コンストラクタ内で、アプリケーションのループを実行するには、一般的に良いアイデアではありません。この時点では、コントロールが完全にセットアップされていないため、何か例外がスローされた場合はおそらく骨が折れるでしょう。バックグラウンドプロセスに対応してコントロールを更新することはそれほど困難ではありません。 UIコントロールの 'Dispatcher.Invoke'メソッドを探します。 –
@ChrisRydingもちろん、MainWindow()はMainWindowクラスインスタンスのコンストラクタです。明らかに、メインメソッドのようなコンストラクタを扱うことは、クラスが決して...まあ...コンストラクタ(このケースでは無限の間)であるという恐ろしい考えです。この実現に役立つことに感謝します。 – James