私のアプリケーションはいくつかのスレッドを実行し、すべてのスレッドは何かを行います。 各スレッドがリストボックスにステータスを表示したいと思っています。各スレッドのステータスを表示
スレッドはスレッドIDなどを使用して自分自身を識別し、ステータスをList
に設定する方法を教えてください。
私のアプリケーションはいくつかのスレッドを実行し、すべてのスレッドは何かを行います。 各スレッドがリストボックスにステータスを表示したいと思っています。各スレッドのステータスを表示
スレッドはスレッドIDなどを使用して自分自身を識別し、ステータスをList
に設定する方法を教えてください。
すべてのスレッドにはIDがあります。
グローバルなデータ構造をある状態で更新するには、辞書を使用してidをキーとして使用します。そのデータ構造のアクセスをロックするのに注意してください:あなたはちょうどあなたが監視したいThreadの(あなたが好きな配列、リスト、)コレクションを保つことができる
Dictionary<int, SomeStateClass> threadStates = new Dictionary<int, SomeStateClass>();
public void updateThreadState(int id, SomeStateClass newState) {
lock (threadStates) {
threadStates[id] = newState;
}
}
管理対象スレッドはThread.CurrentThread.ManagedThreadIdで識別できます。 Invokeをリストボックスに呼び出す(またはWPFを使用している場合はDispatcherを使用する)ことを覚えておいてください。それ以外のスレッドはUIスレッドが直接アクセスできません。
Listにデータを入力してListBoxのデータソースを設定すると、呼び出しを呼び出す必要がありますか? –
@Mahdi:はい、あなたは、セカンダリからのメインスレッドで動作するように、呼び出しが必要です。 – Tigran
代理人でInvoke
を使用できます。各スレッドは、所有するListBoxItemの更新を行います。
。スレッドクラスは、ThreadStateプロパティを含む多くのプロパティを公開します。そこから、必要な情報を簡単に表示することができます。
このように、作業スレッドは状態を通知することを心配する必要はありません。
スレッドのステータスはどういう意味ですか? – Falanwe
@Falanweたとえば残り時間。 –