バックグラウンドワーカーを使用してすべての処理を行っています。その中には、「ログ」テキスト ボックスに書き込む場所がたくさんあります。これらはすべてうまく機能しますが、background-worker の最後、最後の行で、もう 1 つの呼び出しSynchronizationContext
が発生しません。最後の呼び出しではなく、他のすべての呼び出しが機能するのはなぜですか?
アプリケーションが「ハング」するだけで、次のような EventLog エントリさえあることを付け加えておきます。
プログラム MVST.CodeSync.exe バージョン 2.0.0.0 は Windows との対話を停止し、終了しました。 問題に関する詳細情報があるかどうかを確認するには、アクション センターのコントロール パネルで問題の履歴を確認してください。 プロセス ID: 1f5c 開始時間: 01ccc0e2e7ca1d42 終了時間: 16 アプリケーション パス: C:\Users\ganders\Desktop\NewCodeSync\MVST.CodeSync.exe レポート ID: 629f3533-2cd6-11e1-9e15-005056b75254
メソッドは次のとおりDoWork
です ( の呼び出し時に実行されRunWorkerAsync
ます)。
private void bgw_StartCompare(object sender, DoWorkEventArgs e)
{
OnWriteLogArgs args = null;
CompareData compareData = e.Argument as CompareData;
// We need to iterate through all of the nodes and if they are checked, continue
foreach (TreeNode subSystemNode in compareData.TreeNodes)
{
if (!subSystemNode.Checked)
continue;
args = new OnWriteLogArgs(String.Format("-------------------------- Comparing sub-system: \"{0}\" with CompareType: \"{1}\" --------------------------", subSystemNode.Text, compareData.CompareType));
syncContext.Post(delegate { OnWriteLog(args); }, null);
// Each of these nodes should be a server, so continue
foreach (TreeNode serverNode in subSystemNode.Nodes)
{
if (!serverNode.Checked)
continue;
args = new OnWriteLogArgs(String.Format("-------------------------- Comparing server: \"{0}\" with CompareType: \"{1}\" --------------------------", serverNode.Text, compareData.CompareType));
syncContext.Post(delegate { OnWriteLog(args); }, null);
// The "tag" contains the server information that we need to do the comparison
CustomConfig.Server server = (CustomConfig.Server)serverNode.Tag;
if (!compareData.DoneInitialCompare)
CompareAll(compareData, server, string.Empty, server.CompareBasePath, serverNode, compareData.CompareType);
else
CompareAllByTreeNode(compareData, server, serverNode, compareData.CompareType);
}
}
syncContext.Post(delegate { OnWriteLog(new OnWriteLogArgs("Finished the compare...")); }, null);
RebuildTreeViewArgs rArgs = new RebuildTreeViewArgs(compareData.OnlyShowDifferences, compareData.TreeNodes);
syncContext.Post(delegate { OnRebuildTreeView(rArgs); }, null);
MessageBox.Show("It made it...");
syncContext.Post(delegate { OnWriteLog(new OnWriteLogArgs("Finished calling the rebuild tree view method...")); }, null);
}
foreach
ループの最後でFinished the compare...
、次の同期呼び出しが実行されます。
syncContext.Post(delegate { OnRebuildTreeView(rArgs); }, null);
実行されることはありません。その方法は次のとおりです。
private void OnRebuildTreeView(RebuildTreeViewArgs args)
{
syncContext.Post(delegate { OnWriteLog(new OnWriteLogArgs("Made it to the OnRebuildTreeView method...")); }, null);
while (bgw.IsBusy)
{
syncContext.Post(delegate { OnWriteLog(new OnWriteLogArgs("Sleeping...")); }, null);
Thread.Sleep(1000);
}
syncContext.Post(delegate { OnWriteLog(new OnWriteLogArgs("Starting the rebuild of the TreeView...")); }, null);
TreeNode[] tn = args.NewStructure;
tvSync.Nodes.Clear();
foreach (TreeNode node in tn)
tvSync.Nodes.Add(node);
foreach (TreeNode node in tvSync.Nodes)
FixCheckedAndUnCheckedNodes(node);
ReloadTreeView(args.OnlyShowDifferences);
}