したがって、私は最近、既存のWinFormsアプリケーションを引き継ぎました。システムトレイで実行するものに変更する必要がありますが、ユーザーが望むときにはフォームがポップアップします。問題ない。この質問によると:Mutex is being used to ensure only one copy of the app is running私のシステムトレイアプリでクロススレッドの問題を適切に処理するにはどうすればよいですか?
このアプリケーションには3つの主要コンポーネントがあります:カスタムアプリケーションコンテキスト(myContext)は、システムのすべての迷子を処理します。 myContextは、Gozer(myGozer)というクラスのインスタンスを作成します。 Gozerは本当のことをすべて行います。一定の時間間隔で一連の操作を実行します(ネットワークの状態を確認してから接続すれば、いくつかのことが実行されます)。それは、みんなが一連のイベントを通じて何が起こっているのかを知りましょう。 myFormが開かれると、myContextはmyGozerを渡します。
これは、私があらゆる種類のクロススレッディングの問題に突き当たるmyFormを開いたときです(何らかの方法でコントロールが使用されているときはいつでもmyListViewを操作します)。私が明らかにしていないことは、これに対処する最善の方法です。スレッドについてはほとんど知りません。私は30秒でスレッディングを理解することができる超大な脳を持っていません。そして、私は吸収するために食べることができる周りの誰も持っていない彼らのスレッドの優れた知識。
this questionによれば、私は単にsomeControl.InvokeRequired
をチェックして、デリゲートを介して問題のメソッドを呼び出します。これは機能します。しかし、今私は、私の頭の中で校正されていないいくつかの警鐘を発するコントロールを扱う必要があるたびに、たくさんのコードを削除するようになっています。私はまた、フォームからアプリケーションを終了するときに問題を発見しました。これにより、別のクロススレッディング例外がmyContextに戻されます。私は、アプリケーションをmyFormからもう終了させることが適切であるとは確信していませんが、この時点で他のクロススレッドの狂気が私を待っていますか?私は多くの副作用誘発性頭痛のために自分自身を設定しているように感じる。
私は実際に道路の潜在的な問題の束を作成することを心配していると思います。あるいは、Gozerの機能を拡張し、それがmyFormで動作する必要がある場合には、さらなる問題を作成するよう求められます。また、実行中にmyFormを開いたり閉じたりすると、クロススレッドに関する追加の問題が発生します。または、アプリケーションがすべてを爆発させる原因になります。
私には考慮すべき点がいくつかありますか?
注:これは.net 2.0アプリ用ですので、Jethroのソリューションはここでは機能しません。それはではないので、私はInvokeRequiredロジックを書く必要があるので、私はちょうどそれを行うつもりだと言った。私は次の年にこれを.net 3.5にアップグレードするつもりだと確信しています。下の提案されたクラスは、私が彼の問題をどのように処理するかです。私はそれを結果として答えとしてマークしています。
これは、.NET 2.0のためです。面白そうに見えますが、Funcについて何をすべきか見てみましょう<> – peacedog
うわー、私は最後のコメントを盗んだ。私が最初に書いたのは、 "2.0、私は拡張メソッドを使うことができませんでした"でしたが、4.0プロジェクトでこれを使って遊んでいたし、奇妙なパスをさまよって何かを混乱させました。しかし、ええ、私はこれを行うことはできません。私は本当に答えが好きです。 – peacedog
拡張メソッドは、静的メソッドの単なる構文的な砂糖です。 2.0では動作を複製することはできますが、静的メソッドを手動で呼び出して最初のパラメータとしてコントロールを渡す必要があります。また、独自のバージョンのActionおよびFuncデリゲートを作成する必要があります(これらのデリゲートは3.0または3.5の一部です)。 –