1

バックグラウンドワーカーを使用してすべての処理を行っています。その中には、「ログ」テキスト ボックスに書き込む場所がたくさんあります。これらはすべてうまく機能しますが、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);
}
4

1 に答える 1

2
MessageBox.Show("It made it...");

また、問題を引き起こしている可能性があります。これはUIスレッドを想定しているため、実際にはバックグラウンドスレッド上にあります

于 2011-12-22T20:20:20.960 に答える