I work with a background worker in C #. Here is a class, and under it you will find its instansiation, and there I will define my problem for you:
I have a Drawing class:
class Drawing
{
BackgroundWorker bgWorker;
ProgressBar progressBar;
Panel panelHolder;
public Drawing(ref ProgressBar pgbar, ref Panel panelBig)
{
this.panelHolder = panelBig;
this.progressBar = pgbar;
bgWorker = new BackgroundWorker();
bgWorker.WorkerReportsProgress = true;
bgWorker.WorkerSupportsCancellation = true;
bgWorker.DoWork += new OpenNETCF.ComponentModel.DoWorkEventHandler(this.bgWorker_DoWork);
bgWorker.RunWorkerCompleted += new OpenNETCF.ComponentModel.RunWorkerCompletedEventHandler(this.bgWorker_RunWorkerCompleted);
bgWorker.ProgressChanged += new OpenNETCF.ComponentModel.ProgressChangedEventHandler(this.bgWorker_ProgressChanged);
}
public void createDrawing()
{
bgWorker.RunWorkerAsync();
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
Panel panelContainer = new Panel();
for(i=0; i<100; i++)
{
Panel panelSubpanel = new Panel();
panelContainer.Controls.Add(panelSubpanel);
bgWorker.ReportProgress(0, i);
}
e.Result = panelContainer;
}
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar.Value = (int)e.UserState;
this.progressBar.Update();
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
this.panelHolder = (Panel)e.Result;
}
else
{
MessageBox.Show("An error occured, please try again");
}
}
}
The instance of this class is:
public partial class Draw: Form
{
public Draw()
{
ProgressBar progressBarLoading = new ProgressBar();
Panel panelBigPanelContainer = new Panel();
Drawing drawer = new Drawing(ref progressBarLoading, ref panelBigPanelContainer);
drawer.createDrawing();
}
}
Here is my problem: In private void bgWorker_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)
I do not get e.Result, as it should be. When I debug and look at e.Result, the panel properties have this exception message:
'((System.Windows.Forms.Control)(e.Result)).ClientSize' threw an exception of type 'System.ObjectDisposedException'
Thus, the object becomes deleted, but “why” is my question, and how can I fix it?
I hope someone answers me, it makes me go crazy. Another question I have is: is the use of ref arguments allowed? is it bad programming?
Thanks in advance.
, :
, "" :
bgWorker.RunWorkerAsync(); => starts a new thread.
bgWorker_DoWork cannot reach the main thread without delegates
-
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
the main thread
e.Result => This is an argument which can be reached by
bgWorker_RunWorkerCompleted()
bgWorker.ReportProgress(progressVar); => Reports the progress to the
bgWorker_ProgressChanged()
}
-
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
(e.g update a control)
this.ProgressBar.Value = e.ProgressPercentage;
}
-
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
this.panelTileHolder = (Panel)e.Result;
}
else
{
MessageBox.Show("There was an error");
}
}