私はすべての処理を行うためにバックグラウンドワーカーを使用しています。その中には、「ログ」テキストボックスに書き込む場所がたくさんあります。それらはすべて素晴らしいですが、バックグラウンドワーカーの最後の最後の行では、私はSynchronizationContext
を経由してもう1発は発砲しません。なぜ、他のすべての呼び出しは機能し、最後の呼び出しは動作しませんか?SynchronizationContext.Postが内部で動作していないBackgroundWorker
私は、アプリケーションが単に "ハング" というを追加する必要があります、とのEventLogエントリは言っても、あります:
The program MVST.CodeSync.exe version 2.0.0.0 stopped interacting with Windows and was closed. To see if more information about the problem is available, check the problem history in the Action Center control panel. Process ID: 1f5c Start Time: 01ccc0e2e7ca1d42 Termination Time: 16 Application Path: C:\Users\ganders\Desktop\NewCodeSync\MVST.CodeSync.exe Report Id: 629f3533-2cd6-11e1-9e15-005056b75254
ここで(RunWorkerAsync
を呼び出したときに実行される)DoWork
方法があります:
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);
}
GUIスレッド内で 'OnRebuildTreeView'がすでに実行されている場合、' syncContext'をなぜ呼び出すのですか?また、 'Thread.Sleep 'コールは良いアイデアではないGUIスレッドをフリーズしようとしています。これらがアプリケーションをハングアップさせるかどうかはわかりませんが、うまく見えません。また、 '.Post'は呼び出し元をブロックしません。なぜなら、ロジックが' .Send'をブロックする必要がある場合です。 –
良い点は、OnRebuildTreeViewメソッドからsyncContext呼び出しを行うことについて考えなかった...私はそれを取り出します。 Thread.Sleep()まで、私はちょうどその場合に追加しました...(デバッグの試行が増えています)。私はそのものを取り除き、もう一度やり直します。ありがとう – ganders
'OnRebuildTreeView'を' RunWorkerCompleted'イベントにアタッチすると、スレッドのメインメソッドが終了した後に実行したいと思うようなコードから、より簡単になるかもしれません。 –