473,401 Members | 2,068 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,401 software developers and data experts.

System.Timers.Timer and InvokeRequired

Hi all,

I set up a System.Timers.Time in my app. The code basically just updates
the screen, but since the processing performed is so CPU-intensive, I wanted
to make sure it gets updated regularly; like every 1.5 secs. or so. I only
ran into one issue - the MyTimer_Elapsed event handler was not updating the
screen correctly all the time, often leaving large chunks of the screen
un-painted for several seconds.

On a whim I decided to check the InvokeRequired property of my form in the
Event Handler... and whaddyaknow, it was True. So now I've added the proper
code to check InvokeRequired and to update the screen using Invoke(), but I
hadn't realized I needed to use Invoke to update the screen from within the
System.Timers.Timer? Even in the sample MSDN code for the
System.Timers.Timer they leave out the Invoke(); i.e.:

Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As
System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show("Elapsed!", _
"Timer Event Raised!")
End Sub

While I know that Invoke() must be called to update the UI from worker
threads, outside of that is its usage more or less a matter of trial and
error? Or are there additional rules that should be followed when
determining when to use Invoke()?

Just wondering. Thanks.
Nov 21 '05 #1
5 9843
The System.Timers.Timer runs on a different thread to the main UI of the
application. Even though the code for the timer service might be in your
form, the thread it's called on will be different and therefore you'll need
to check to see if other methods in your form or class should be called
using invoke.

Generally, you should know whether you're using threads either explicitly or
implicitly as in the case of System.Timers.Timer and code for those
circumstances. Unfortunately the only way to know this is to read the fine
print in the docs.

Don't cite MSDN as a shining example. It's full to bursting with
horribleness. See if you can find an example of Dispose being used on a
Graphic object in there...

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.

"Michael C#" <xy*@yomomma.com> wrote in message
news:eY**************@TK2MSFTNGP15.phx.gbl...
Hi all,

I set up a System.Timers.Time in my app. The code basically just updates
the screen, but since the processing performed is so CPU-intensive, I
wanted to make sure it gets updated regularly; like every 1.5 secs. or so.
I only ran into one issue - the MyTimer_Elapsed event handler was not
updating the screen correctly all the time, often leaving large chunks of
the screen un-painted for several seconds.

On a whim I decided to check the InvokeRequired property of my form in the
Event Handler... and whaddyaknow, it was True. So now I've added the
proper code to check InvokeRequired and to update the screen using
Invoke(), but I hadn't realized I needed to use Invoke to update the
screen from within the System.Timers.Timer? Even in the sample MSDN code
for the System.Timers.Timer they leave out the Invoke(); i.e.:

Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As
System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show("Elapsed!", _
"Timer Event Raised!")
End Sub

While I know that Invoke() must be called to update the UI from worker
threads, outside of that is its usage more or less a matter of trial and
error? Or are there additional rules that should be followed when
determining when to use Invoke()?

Just wondering. Thanks.

Nov 21 '05 #2
In article <eY**************@TK2MSFTNGP15.phx.gbl>, Michael C# wrote:
Hi all,

I set up a System.Timers.Time in my app. The code basically just updates
the screen, but since the processing performed is so CPU-intensive, I wanted
to make sure it gets updated regularly; like every 1.5 secs. or so. I only
ran into one issue - the MyTimer_Elapsed event handler was not updating the
screen correctly all the time, often leaving large chunks of the screen
un-painted for several seconds.

On a whim I decided to check the InvokeRequired property of my form in the
Event Handler... and whaddyaknow, it was True. So now I've added the proper
code to check InvokeRequired and to update the screen using Invoke(), but I
hadn't realized I needed to use Invoke to update the screen from within the
System.Timers.Timer? Even in the sample MSDN code for the
System.Timers.Timer they leave out the Invoke(); i.e.:

Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As
System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show("Elapsed!", _
"Timer Event Raised!")
End Sub

While I know that Invoke() must be called to update the UI from worker
threads, outside of that is its usage more or less a matter of trial and
error? Or are there additional rules that should be followed when
determining when to use Invoke()?

Just wondering. Thanks.


The rule is that if the procedure that is updating your UI is on another
thread, you must use invoke to marshal back to that thread. This is
necessary with System.Timers because all the calls happen on a
ThreadPool thread.

That said, the System.Timer.Timer component has the ability to
automatically marshal calls to a specific object via the SyncronizingObject
property. If you add the component from the components dialog in the
ide to a form, it should automatically set this to the form. If you
creat the object in code - then this will be null (nothing in vb) and
you have the problem you mentioned. So, if you create it in code, you
could always set it to the form you want to update it manully - before
you start it ticking :)

--
Tom Shelton [MVP]
Nov 21 '05 #3
Thanks for the info. While we're on the topic, is it ok to assume that
Invoke needs to be called for *all* UI objects at a given point in time if
InvokeRequired is True for the Form itself? In a lot of code I've seen, for
some reason the authors feel the need to check InvokeRequired for each and
every object they're updating on the UI; every text box, each label, all
progress bars, etc. It seems that if the form itself needs to be Invoked,
then all of the controls it contains would need to be Invoked. Is this a
safe assumption? Or is there a special reason to call InvokeRequired
multiple times for each individual control?

Thanks again

"Bob Powell [MVP]" <bob@_spamkiller_bobpowell.net> wrote in message
news:ea**************@TK2MSFTNGP10.phx.gbl...
The System.Timers.Timer runs on a different thread to the main UI of the
application. Even though the code for the timer service might be in your
form, the thread it's called on will be different and therefore you'll
need to check to see if other methods in your form or class should be
called using invoke.

Generally, you should know whether you're using threads either explicitly
or implicitly as in the case of System.Timers.Timer and code for those
circumstances. Unfortunately the only way to know this is to read the fine
print in the docs.

Don't cite MSDN as a shining example. It's full to bursting with
horribleness. See if you can find an example of Dispose being used on a
Graphic object in there...

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.

"Michael C#" <xy*@yomomma.com> wrote in message
news:eY**************@TK2MSFTNGP15.phx.gbl...
Hi all,

I set up a System.Timers.Time in my app. The code basically just updates
the screen, but since the processing performed is so CPU-intensive, I
wanted to make sure it gets updated regularly; like every 1.5 secs. or
so. I only ran into one issue - the MyTimer_Elapsed event handler was not
updating the screen correctly all the time, often leaving large chunks of
the screen un-painted for several seconds.

On a whim I decided to check the InvokeRequired property of my form in
the Event Handler... and whaddyaknow, it was True. So now I've added the
proper code to check InvokeRequired and to update the screen using
Invoke(), but I hadn't realized I needed to use Invoke to update the
screen from within the System.Timers.Timer? Even in the sample MSDN code
for the System.Timers.Timer they leave out the Invoke(); i.e.:

Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As
System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show("Elapsed!", _
"Timer Event Raised!")
End Sub

While I know that Invoke() must be called to update the UI from worker
threads, outside of that is its usage more or less a matter of trial and
error? Or are there additional rules that should be followed when
determining when to use Invoke()?

Just wondering. Thanks.


Nov 21 '05 #4
In article <eR**************@tk2msftngp13.phx.gbl>, Michael C# wrote:
Thanks for the info. While we're on the topic, is it ok to assume that
Invoke needs to be called for *all* UI objects at a given point in time if
InvokeRequired is True for the Form itself? In a lot of code I've seen, for
some reason the authors feel the need to check InvokeRequired for each and
every object they're updating on the UI; every text box, each label, all
progress bars, etc. It seems that if the form itself needs to be Invoked,
then all of the controls it contains would need to be Invoked. Is this a
safe assumption? Or is there a special reason to call InvokeRequired
multiple times for each individual control?

Thanks again


I only check the form... I see no need to check all it's child
controls, since they are going to be on the same thread as the form.
So, basically, if the form returns true for InvokeRequired, all it's
contained controls are going to as well.

--
Tom Shelton [MVP]
Nov 21 '05 #5
Most applications will be single threaded and so one can assume that
checking InvokeRequired is not necessary. Threaded UI updates are not
recommended but they are possible but any developer using them needs to be
aware of the problems they can cause and techniques to keep the app running
sweetly.

The rule of thumb is one thread means no need to bother with InvokeRequired
ever. More than one thread means that you ALWAYS check from the non-UI
threads.

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.

"Michael C#" <xy*@yomomma.com> wrote in message
news:eR****************@tk2msftngp13.phx.gbl...
Thanks for the info. While we're on the topic, is it ok to assume that
Invoke needs to be called for *all* UI objects at a given point in time if
InvokeRequired is True for the Form itself? In a lot of code I've seen,
for some reason the authors feel the need to check InvokeRequired for each
and every object they're updating on the UI; every text box, each label,
all progress bars, etc. It seems that if the form itself needs to be
Invoked, then all of the controls it contains would need to be Invoked.
Is this a safe assumption? Or is there a special reason to call
InvokeRequired multiple times for each individual control?

Thanks again

"Bob Powell [MVP]" <bob@_spamkiller_bobpowell.net> wrote in message
news:ea**************@TK2MSFTNGP10.phx.gbl...
The System.Timers.Timer runs on a different thread to the main UI of the
application. Even though the code for the timer service might be in your
form, the thread it's called on will be different and therefore you'll
need to check to see if other methods in your form or class should be
called using invoke.

Generally, you should know whether you're using threads either explicitly
or implicitly as in the case of System.Timers.Timer and code for those
circumstances. Unfortunately the only way to know this is to read the
fine print in the docs.

Don't cite MSDN as a shining example. It's full to bursting with
horribleness. See if you can find an example of Dispose being used on a
Graphic object in there...

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.

"Michael C#" <xy*@yomomma.com> wrote in message
news:eY**************@TK2MSFTNGP15.phx.gbl...
Hi all,

I set up a System.Timers.Time in my app. The code basically just
updates the screen, but since the processing performed is so
CPU-intensive, I wanted to make sure it gets updated regularly; like
every 1.5 secs. or so. I only ran into one issue - the MyTimer_Elapsed
event handler was not updating the screen correctly all the time, often
leaving large chunks of the screen un-painted for several seconds.

On a whim I decided to check the InvokeRequired property of my form in
the Event Handler... and whaddyaknow, it was True. So now I've added
the proper code to check InvokeRequired and to update the screen using
Invoke(), but I hadn't realized I needed to use Invoke to update the
screen from within the System.Timers.Timer? Even in the sample MSDN
code for the System.Timers.Timer they leave out the Invoke(); i.e.:

Private Sub myTimer_Elapsed(ByVal sender As System.Object, ByVal e As
System.Timers.ElapsedEventArgs)
System.Windows.Forms.MessageBox.Show("Elapsed!", _
"Timer Event Raised!")
End Sub

While I know that Invoke() must be called to update the UI from worker
threads, outside of that is its usage more or less a matter of trial and
error? Or are there additional rules that should be followed when
determining when to use Invoke()?

Just wondering. Thanks.



Nov 21 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Peter Johnsson | last post by:
How come the eventhandler for the timer's elapsed time event is called over and over again, even though the AutoReset property is set to false, if you assign a new value to the timer objects...
9
by: Mark Rae | last post by:
Hi, I've seen several articles about using System Timers in ASP.NET solutions, specifically setting them up in Global.asax' Application_OnStart event. I'm thinking about the scenario where I...
10
by: WhiteSocksGuy | last post by:
Help! I am new to Visual Basic .Net (version 2002) and I am trying to get a System.Timers.Timer to work for me to display a splash screen for about two seconds and then load the main form. I have...
1
by: melanieab | last post by:
Hi, I'm have a datagrid, and I'm trying to have a tooltip pop up if a cell has been hovered on for 2 seconds. I was thinking of using DataGrid.Hover, but then decided to try this instead: ...
2
by: cntams | last post by:
All, I have a Windows Service and it has one System.Timers.Timer that fires every 500 milliseconds. Now I have noticed that there's a bug in System.Timers.Timer when it's being used combined with...
4
by: Liverpool fan | last post by:
I have a windows application written using VB .NET that encompasses a countdown timer modal dialog. The timer is a System.Timers.Timer with an interval of 1 second. AutoReset is not set so accepts...
5
by: Tony Gravagno | last post by:
I have a class that instantiates two Timer objects that fire at different intervals. My class can be instantiated within a Windows Form or from a Windows Service. Actions performed by one of the...
2
by: BobAtVandy | last post by:
I'll greatly appreciate any help on this. Actually 2 questions: 1. I believe I need to use the Windows timer System.Timers.Timer . The examples I find on the web all access that timer by...
8
by: Ollie Riches | last post by:
I'm looking into a production issue related to a windows service and System.Timers.Timer. The background is the windows service uses a System.Timers.Timer to periodically poll a directory location...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.