Click here to Skip to main content
15,897,519 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
i want to create a form and put a list box into it and then update it with some information from another thread by ma,king use of multi threading and delegates and events
also please give explicit information about doing this task using background worker
Posted
Comments
[no name] 19-Apr-14 8:03am    
Why are you unable to see the example for the background worker in the documentation?

1 solution

FORM1 CODE

C#
private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);//this is required to update list by calling public method in Form1. Not required for event based update
            form2.OnMyForm2Event += AddToListViewByListeningToEvent;
            form2.Show();
        }

        public void AddToListUsingPublicProperty(string item)
        {
            listBox1.Invoke(new MethodInvoker(() =>
            {
                listBox1.Items.Add(item);
            }));
        }


        private void AddToListViewByListeningToEvent(object sender, MyEventArgs e)
        {
            listBox1.Invoke( new MethodInvoker( () =>
            {
                listBox1.Items.Add(e.EventData);
            }));
        }

------------------------------------------------------------------------
FORM2 CODE
-------------------------------------------------------------------------------
public partial class Form2 : Form
{

public event EventHandler<myeventargs> OnMyForm2Event;
BackgroundWorker _bw = new BackgroundWorker();
public Form1 _Form1;

public Form2()
{
InitializeComponent();
}

public Form2(Form1 form1)
{
InitializeComponent();
this._Form1 = form1;
_bw.DoWork += DoBackgroundWork;
_bw.RunWorkerCompleted += OnRunWorkerCompleted;
}
#region BackgroundWorker

private void btnUsingBackgroundWorker_Click(object sender, EventArgs e)
{
_bw.RunWorkerAsync();
}

private void DoBackgroundWork(object sender, DoWorkEventArgs e)
{

//Do some heavy duty operations
if (OnMyForm2Event != null)
OnMyForm2Event(this, new MyEventArgs("ItemFromForm2UsingBGThread"));

//Add item by calling public property on Form1
_Form1.AddToListUsingPublicProperty("ItemAddedDirectlyByCallingPublicMethod-BackGroundWorker");
}

private void OnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_Form1.AddToListUsingPublicProperty("ItemAddedWhenBackgroundworkerFinisheswork");
}
#endregion
#region Thread
private void btnUpdateUsingThread_Click(object sender, EventArgs e)
{
Thread t = new Thread(PerformActionOnThread);
t.Start("ItemFromForm2UsingThread");

}

private void PerformActionOnThread(object value)
{
//Add using Event
if (OnMyForm2Event != null)
OnMyForm2Event(this, new MyEventArgs(value.ToString()));

//Add item by calling public property on Form1
_Form1.AddToListUsingPublicProperty("ItemAddedDirectlyByCallingPublicMethod-Thread");
}

#endregion

#region Task
private void btnUsingTask_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() => _Form1.AddToListUsingPublicProperty("ItemAddedByTask")).
ContinueWith(x => _Form1.AddToListUsingPublicProperty("ItemAddedOnTaskCompletion"));
}
#endregion
}

public class MyEventArgs : EventArgs
{
public string EventData { get; set; }
public MyEventArgs(string eventData)
{
EventData = eventData;
}
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900