多数のシミュレーションを保持できる「プロジェクト」があるシミュレーション コードに取り組んでいます。一度に 1 つずつ実行することも、すべて順番に実行することもできます。この特定のケースでは、1 つずつ実行する 18 のシミュレーションがあり、全体のプロセスには約 20 秒かかります。
つまり、フォームでボタンが押されると、次のアクションが発生します。
1) シミュレーション オブジェクトを作成する
2) シミュレーション開始コマンドを実行する
3) シミュレーション データをファイルに書き込む
4) シミュレーション オブジェクトを破棄する
5) シミュレーション リストを保持する DataGridView を更新する (「処理中」を「完了」に書き換える)
6) ユーザーの進行状況バーの値を更新するコントロール。
7) ユーザー コントロールを更新します。
おおまかなソースコードは以下の通りです。
for (int i = 0; i < dataSet.Count; i++)
{
using (Processor p = new Processor())
{
bool didTestPass = p.RunTest(dataSet[i]);
if (didTestPass)
dataGridViewProcessList.Rows[i].Cells[5].Value = "Run complete.";
else
dataGridViewProcessList.Rows[i].Cells[5].Value = "Run completed with errors.";
}
progressBarRuntime.Value = ((i+1) / dataSet.Count) * 100;
this.Refresh();
this.OnUpdateMainForm(this, null);
}
私が見つけたのは、アプリケーションのフォーカス内にとどまると、18 のシミュレーションすべてが正常に実行されるということです。ただし、フォーカスを落とすと (たとえば、別のプログラムに切り替えると)、8 回目のシミュレーションで一貫して不規則な動作をします。動作が異なるため、私は不規則に言います。
Visual Studio を使用してデバッグすると、フォームが一時的にフリーズし、その後、残りのすべてのシミュレーションが突然処理され、進行状況バーが完全にスナップします。
スタンドアロン プログラムとして実行すると、デスクトップに直接クラッシュします。警告なし、例外スローなし、何もありません。
また、集中したまま、たとえばシミュレーション 14 に到達した後、プログラムからフォーカスを外すと、すぐに上記の動作が発生することもわかりました。
私は、Windows フォームがアクティブなときに内部で大規模な計算作業を実行するという概念に特に精通していません。最初は、フォームを更新する必要があるのではないかと感じましたが (これはすべて UserControl で発生しているため)、フォームを強制的にRefresh()
.