2017-07-01 34 views
0

創建控制我有這樣的代碼:從BackgroundWorker的

public Form1() 
    { 
     InitializeComponent(); 

     BackgroundWorker bw = new BackgroundWorker(); 
     bw.WorkerSupportsCancellation = true; 
     bw.WorkerReportsProgress = true; 
     bw.DoWork += (s, ev) => show(); 
     bw.RunWorkerAsync(); 
    } 

    private void show() 
    { 
     MessageBox.Show("aaaaaa"); 

     PictureBox load = new PictureBox(); 
     load.BackColor = Color.White; 
     load.Width = this.Width; 
     load.Height = this.Height; 
     load.Left = 0; 
     load.Top = 0; 
     load.Name = "load"; 

     this.Controls.Add(load); 
     load.BringToFront(); 

     MessageBox.Show("bbbbb"); 
    } 

PictureBox的將不能創建和「BBBBB」消息框不會出現。

什麼問題?

回答

1

的問題是,您所創建的另一個Thread的控制比你的GUI中運行。BackgroundWorkerDoWork事件處理完畢後觸發事件RunworkerCompletedRunworkerCompleted然後在名爲DoWork(在你的情況下是主線程)的Thread中運行。所以,你做的所有的非GUI相關工作DoWork和GUI的東西,在RunWorkerCompleted

public Form1() 
{ 
    InitializeComponent(); 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.WorkerSupportsCancellation = true; 
    bw.WorkerReportsProgress = true; 
    bw.DoWork += (s, ev) => calculate(); 
    bw.RunWorkerCompleted += (s, ev) => show(); 
    bw.RunWorkerAsync(); 
} 

private void calculate() 
{ 
    // Do some heavy work 
    Thread.Sleep(5000); 
} 

private void show() 
{ 
    MessageBox.Show("aaaaaa"); 

    PictureBox load = new PictureBox(); 
    load.BackColor = Color.White; 
    load.Width = this.Width; 
    load.Height = this.Height; 
    load.Left = 0; 
    load.Top = 0; 
    load.Name = "load"; 

    this.Controls.Add(load); 
    load.BringToFront(); 

    MessageBox.Show("bbbbb"); 
} 
+0

明白了,謝謝! – kovak