コンソールまたは GUI の 2 つのモードを持つ WinForms アプリを作成しています。同じソリューション内の 3 つのプロジェクト。1 つはコンソール アプリ用、1 つは UI フォーム用、3 つ目は 2 つのインターフェイスが両方とも接続するロジックを保持します。コンソール アプリは非常にスムーズに動作します。
ユーザー選択を保持するモデルでIList<T>
、 T がローカル オブジェクトでありStep
、 を実装INotifyPropertyChanged
しているため、UI では DataGridView にマウントされます。実行時には問題なく、オブジェクトの初期状態が画面に反映されます。
各Step
オブジェクトは順番に実行されるタスクです。一部のプロパティは変更され、IList に反映されて DataGridView に渡されます。
UI バージョンでのこのアクションは、イベントを UI に戻す BackgroundWorker を作成することによって行われます。do it は、結果 (実行中、NotRun、OK、NotOK、警告など) を示す列挙型でStep
あるオブジェクトと、メッセージを示す文字列 (ステップが実行されたが、期待どおりではないため、つまり、警告があるため) を生成します。StepResult
)。通常、アクションにはデータベースとのやり取りが含まれますが、デバッグ モードではランダムに結果を生成します。
メッセージが null の場合は問題ありませんが、次のような応答を生成すると:
StepResult returnvalue = new StepResult(stat, "completed with caveat")
DataGridView が作成されたスレッド以外のスレッドからアクセスされているというエラーが表示されます。(私はこれを、必要に応じて呼び出しを処理するカスタム ハンドラーに渡しています。おそらくそうではないでしょうか?)
次に、たとえば乱数を使用して、一意の応答を生成した場合r
:
StepResult returnvalue = new StepResult(stat, r.ToString());
アクションは問題なく成功し、数値は DataGridView にきれいに書き込まれます。
私は困惑しています。どういうわけか文字列リテラルの問題だと思いますが、誰かがより明確な説明を思い付くことができますか?