views:

329

answers:

3

Hi I'm developing a .Net application and I want to achieve the following:

I have a winforms application, and a timer (System.Timers.timer) that excecutes a thread based on a schedule. The problem is that I cannot access the UI (windows form) from the secondary thread (WorkerThread), the error say something like the component cannot be accessed from a thread that didn't create it.

Is there any way to achieve this?

Thanks!

+10  A: 
 formObject.Invoke(delegate { 
      // action to perform on UI thread
 });
Mehrdad Afshari
And note that this work basically gets added to a work queue for the UI thread which will eventually execute it when it has time.
Scott Whitlock
A: 

Control.Invoke is your friend

consultutah
+2  A: 

Let's say that your worker method (that you execute in a thread) is

DoWork(args)
{
    ...
    UpdateUI();
}

The method that handles timer's Elapsed event should do this:

OnTimerElapsed(object sender, ElapsedEventArgs e)
{
    args = GetArgs();
    this.BeginInvoke(() => DoWork(args));
    // 'this' refers to form here.
    // You can also use BeginInvoke on a user control for updating it.
}

This will run DoWork in a seperate thread and DoWork will have the ability of updating UI.

Serhat Özgel