【问题标题】:best solution to show/hide a form which is running a thread显示/隐藏正在运行线程的表单的最佳解决方案
【发布时间】:2012-04-25 13:48:00
【问题描述】:

我有一个主表单和一个分析表单。主窗体有一个名为“显示分析窗体”的按钮。 分析表单将运行一个线程。它还有一个名为“在后台工作”的按钮,可以隐藏分析表单。
线程处理完成后,应显示分析表单(无论是否单击“后台工作”按钮),并且应启用分析表单中的一些控件。
我有一些代码来描述我的努力,但它不能正常工作。
那么问题是什么,实现这一目标的最佳解决方案是什么?有没有关于这个的样本或文章讨论?

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();
    }
}

【问题讨论】:

  • 什么是“工作不正常”?

标签: c# winforms multithreading


【解决方案1】:

我猜你必须在 AnalyzerForm 中使用BackgroundWorker 线程。

BackgroundWorker.OnRunWorkerCompleted在主线程中执行时,您可以显示AnalyzerForm backk。

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多