1

メインフォームと分析フォームがあります。メインフォームには「フォームの分析を表示」という名前のボタンがあります。分析フォームはスレッドを実行します。また、分析フォームを非表示にする「WorkInBackground」という名前のボタンもあります。
スレッドのプロセスが終了したら、分析フォームが表示され([バックグラウンドで作業]ボタンがクリックされたかどうかに関係なく)、分析フォームの一部のコントロールが有効になっている必要があります。
私の努力を説明するコードがいくつかありますが、正しく機能しません。
では、問題は何ですか、そしてこれを達成するための最良の解決策は何ですか?これについて議論しているサンプルや記事はありますか?

public partial class frmAnalyze : Form
{
    Form owner;

    public frmAnalyze(frmMain owner)
    {
        InitializeComponent();
        Owner = owner;
     }

    private void btnAnalyze_Click(object sender, EventArgs e)
    {
            btnBackgroundWork.Enabled = true;

            Analyzer analizer = new Analyzer();
            analizer.OnAnalyzeCallback += new AnalyzeCallbackHandler(analizer_OnAnalyzeCallback);
            analizer.OnAnalyzeProgress += new 
     }

    void analizer_OnAnalyzeCallback(object sender, EventArgs arg)
    {
        if (InvokeRequired)
            this.Invoke(new AnalyzeCallbackHandler(analizer_OnAnalyzeCallback), sender, arg);
        else
        {
            Owner.Invoke(new AnalyzeCallbackHandler(((frmMain)Owner).ShowfrmAnalyze), sender, arg);

            SomeControl.Enabled = true;
        }
    }
}

これは、InvokeRequiredが常にfalseを返すという奇妙なことであり、これがメインフォームです

public partial class frmMain : Form
{
    private void biAnalyze_Click(object sender, EventArgs e)
    {
        frmAnalyze = new frmAnalyze(this);
        frmAnalyze.ShowDialog();
    }

    internal void ShowfrmAnalyze(object sender, EventArgs e)
    {
        frmAnalyze.Show();
    }
}
4

1 に答える 1

0

AnalyzerFormでBackgroundWorkerスレッドを使用する必要があると思います。

メインスレッドで実行されるBackgroundWorker.OnRunWorkerCompletedのときに、AnalyzerFormバッククを表示できます。

于 2012-04-26T01:17:09.937 に答える