在单独的线程中在主窗体上显示另一个窗体

时间:2013-10-04 05:37:04

标签: c# multithreading

我正在尝试使用后台工作线程使用以下代码在按钮单击的单独线程中显示主窗体上的另一个窗体:

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        //this.Opacity = 50.5;
        bw.RunWorkerAsync();                      
        GetData();
        bw.CancelAsync();

    }

    private void GetData()
    {
        for (int i = 0; i < 500000; i++)
        {
            datatable.Rows.Add(new object[] { "raj", "raj", "raj", i });
        }
    }

    void bw_DoWork(object sender,DoWorkEventArgs e)
    {

        XtraForm1 frm = new XtraForm1();
        while (!bw.CancellationPending)
        {
            frm.ShowDialog();
            frm.BringToFront();
            continue;
        }
        e.Cancel = true;
    }

但问题是,当我点击主窗体时,在另一个线程中运行的另一个窗体会被隐藏。在主线程完成执行并然后很好地处理它之前,我怎样才能使它可见?

2 个答案:

答案 0 :(得分:3)

简单的答案是:你没有。 UI有一个单独的线程来完成所有可见的用户交互,它应该是UI工作,在为您的工作人员提供控制权之前向您的用户显示一个漂亮的“工作...”窗口。工人完成后,可以关闭窗口。

你的“主”(UI)线程永远不应该“忙”。这将冻结你的窗口。将所有工作加载到后台任务,让主线程空闲,等待工人完成。您的工作线程可能在无限循环中忙碌,您的UI仍然会响应。即使回复只是“仍然有效,对不起”。

答案 1 :(得分:2)

你应该反过来做。将循环移动到主线程中的BackgroundWorker和保留UI内容(显示辅助表单)。然后使用BackgroundWorker的{​​{1}}和ReportProgress等来正确显示/隐藏您的辅助表单。

它看起来像这样: XtraForm1 frm = new XtraForm1();

RunWorkerCompleted