2011-05-17 160 views
1

我试图实现backgroudworker,但是在第二个线程中不起作用,并且表单仍然是loking,e不能调用我的按钮2的事件,有人告诉我为什么发生这种情况?为什么我的backgroundWorker不起作用?

我的代码:

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.DoWork += 
    new DoWorkEventHandler(backgroundWorker1_DoWork); 
    backgroundWorker1.ProgressChanged += 
    new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 
    backgroundWorker1.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
    backgroundWorker1.WorkerReportsProgress = true; 
} 

void backgroundWorker1_RunWorkerCompleted(object sender, 
    RunWorkerCompletedEventArgs e) 
{ 
    MessageBox.Show("Work is done"); 
} 

void backgroundWorker1_ProgressChanged(object sender, 
    ProgressChangedEventArgs e) 
{ 
    this.progressBar1.Value = e.ProgressPercentage; 
} 

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ThreadProc(); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    backgroundWorker1.RunWorkerAsync(); 
} 

void ThreadProc() 
{ 
    //simulate work 
    for (int i = 0; i < 100000; ++i) 
    { 
    int total = i/1000; 
    backgroundWorker1.ReportProgress(total); 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("Another thread"); 
} 

TKS;

回答

0

对于初学者来说,我可以说,后台工作将会从ThreadPool分配的另一个线程。尽管如此,仍然可以锁定您的用户界面,因为当您调用ProgressChangedRunWorkerCompleted事件时,它们会被整理回UI线程。只有DoWork事件适用于另一个ThreadPool线程。

如果您是在UI线程上的而不是,那么您无法访问UI元素(如按钮2而无需额外的工作)。要从其他线程访问UI元素,您需要使用Control.Invoke将回调封送到UI线程。

1

我认为,因为你不断通过让你的线程报告进度100000次更新UI线程,你的UI线程太占用接受click事件从按钮2.我会显著降低报告的数量,看看是否这有什么影响。

由于ProgressBar.Value是一个int,这个应该没有differenece:

for (int i = 0; i < 100; i++) 
    { 
    backgroundWorker1.ReportProgress(i); 
    } 
4

看起来你可以以非常快的速度,这将导致在形式得到锁定了被报告进展情况回形式。

尝试改变,像这样的ThreadProc的方法......仅用于演示目的,当然是:

void ThreadProc() 
{ 
    //simulate work 
    for (int i = 0; i < 100000; ++i) 
    { 
     Thread.Sleep(1); // this should allow the form to breath a little :) 
     int total = i/1000; 
     backgroundWorker1.ReportProgress(total); 
    } 
} 
+0

嗨史蒂夫·迪南,就是这样,谢谢 – Fernando 2011-05-17 15:10:47