views:

78

answers:

4

Hello, I'm very new to multithreading and lack experience. I need to compute some data in a different thread so the UI doesn't hang up, and then send the data as it is processed to a table on the main form. So, basically, the user can work with the data that is already computed, while other data is still being processed. What is the best way to achieve this? I would also be very grateful for any examples. Thanks in advance.

+1  A: 

Checkout this BackgroundWorker sample document.

KMan
A: 

You can send the data to static variable, static variables are shared across threads.

Mark
+1  A: 

Hello, I'm very new to multithreading and lack experience.

It's not so hard.

Initialise your background worker object

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // I need to compute some data in a different thread so the UI doesn't hang up
    // Well! ompute some data here.
    bw.ReportProgress(percentOfCompletion, yourData) // and then send the data as it is processed
    // percentOfCompletion-int, yourData-object(ie, you can send anything. it will be boxed)
}

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
     // to a table on the main form. So, basically, the user can work with the data that is already computed, while other data is still being processed
     List<string> yourData = e.UserState as List<string>; // just for eg i've used a List.
}

What is the best way to achieve this?

RunWorkerAsync(); //This will trigger the DoWork() method

I would also be very grateful for any examples. Thanks in advance.

It's ok:)

Veer
+2  A: 

If you don't want to use the Background worker as answered by KMan you can create a thread yourself.

private void startJob(object work) {
    Thread t = new Thread(
      new System.Threading.ParameterizedThreadStart(methodToCall)
    );
    t.IsBackground = true; // if you set this, it will exit if all main threads exit.
    t.Start(work); // this launches the methodToCall in its own thread.
}

private void methodToCall(object work) {
    // do the stuff you want to do
    updateGUI(result);
}

private void updateGUI(object result) {
    if (InvokeRequired) {
        // C# doesn't like cross thread GUI operations, so queue it to the GUI thread
        Invoke(new Action<object>(updateGUI), result);
        return;
    }
    // now we are "back" in the GUI operational thread.
    // update any controls you like.
}
Patrick