Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单独的线程中在主窗体上显示另一个窗体_C#_Multithreading - Fatal编程技术网

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

C# 在单独的线程中在主窗体上显示另一个窗体,c#,multithreading,C#,Multithreading,我正在尝试使用以下代码在单独的按钮上单击使用后台工作线程在主窗体上显示另一个窗体: private void simpleButton1_Click(object sender, EventArgs e) { //this.Opacity = 50.5; bw.RunWorkerAsync(); GetData(); bw.CancelAsync(); }

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

    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;
    }
private void simpleButton1_单击(对象发送方,事件参数e)
{
//不透明度=50.5;
RunWorkerAsync();
GetData();
CancelAsync();
}
私有void GetData()
{
对于(int i=0;i<500000;i++)
{
添加(新对象[]{“raj”,“raj”,“raj”,i});
}
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
XtraForm1 frm=新的XtraForm1();
而(!bw.CancellationPending)
{
frm.ShowDialog();
frm.BringToFront();
继续;
}
e、 取消=真;
}

但问题是,当我单击主窗体时,另一个运行在单独线程中的窗体被隐藏。如何使其可见,直到主线程完成其执行,然后很好地处理它?

您应该采用另一种方法。将循环移动到主线程中的
BackgroundWorker
和keep UI stuff(显示辅助表单)。然后使用
BackgroundWorker
ReportProgress
RunWorkerCompleted
等正确显示/隐藏辅助表单

它看起来像这样: XtraForm1 frm=新的XtraForm1()

private void simpleButton1_单击(对象发送方,事件参数e)
{
bw.ReportsProgress=真;
RunWorkerAsync();
frm.ShowDialog();
}
私有void GetData()
{
对于(int i=0;i<500000;i++)
{
添加(新对象[]{“raj”,“raj”,“raj”,i});
如果(i%1000==0)bw.ReportProgress((int)((i/500000f)*100));
}
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
GetData();
}
void bw_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
//在这里更新你的二级表单的UI。我假设你有一个ProgressBar
//在名为“pbr”的表单上(将该控件公开)
frm.pbr.Value=e.ProgressPercentage;
}    
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
frm.Hide();
}    

答案很简单:你没有。UI只有一个线程来执行所有可见的用户交互,在将控制权交给工作人员之前,UI的工作应该是向用户显示一个漂亮的“工作…”窗口。工作人员完成后,可以关闭窗口


您的“主”(UI)线程永远不应该“忙”。那会冻结你的窗户。将所有工作加载到后台任务,让主线程空闲等待工作人员完成。您的工作线程可能会在无休止的循环中忙碌,您的UI仍然会响应。即使响应只是“仍在工作,抱歉”。

为什么要在线程而不是UI线程中创建UI元素?请使用模式对话框。。不是这个/我想展示一些东西,比如闪屏显示等待。。主线程在中忙时的文本execution@SimonWhitehead我如何在这里使用模态对话框..@SimonWhitehead您的意思是说我需要在主线程中运行启动屏幕窗体,并在辅助线程中执行其他处理?我不能这样做,因为我在主线程中没有任何操作。所以不能在后台做每件事thread@RajeevKumar你可以。您的后台线程可以在UI线程忙于工作时向其报告进度。
private void simpleButton1_Click(object sender, EventArgs e)
{
    bw.ReportsProgress = true;
    bw.RunWorkerAsync();                      
    frm.ShowDialog();
}

private void GetData()
{
    for (int i = 0; i < 500000; i++)
    {
        datatable.Rows.Add(new object[] { "raj", "raj", "raj", i });
        if(i%1000==0) bw.ReportProgress((int)((i/500000f)*100));
    }
}

void bw_DoWork(object sender,DoWorkEventArgs e)
{
    GetData();
}

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //update your secondary form's UI here. I'm supposing you have a ProgressBar
    //on your form named 'pbr' (make that control public)
    frm.pbr.Value = e.ProgressPercentage;
}    

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    frm.Hide();
}