C# - Prevent System.Timers.Timer From Queuing For Execution On A Thread Pool?
Feb 2, 2011
There is a problem with standard System.Timers.Timer behaviour. The timer raise Elapsed event with some interval. But when time of execution inside Elapsed event handler exceed timer interval then thread pool begin queuing event handling. This is a problem in my case. This is because with my Elapsed event handler I fetch some data from database and doing something with it and finally save results back to database. But data handling should be provided only once. So, is there a way to prevent from queuing elapse events for System.Timers.Timer.
As illustration for this issue you can consider next test program:
[code]...
2) Second way is about SynchronizingObject, but it is a valuable only for Windows form application or required additional development of code for implementing object that would be implements ISynchronizeInvoke interface. More about this way you can find here
I need an accurate timer to interface a Windows application to a piece of lab equipment.I used System.Timers.Timer() to create a timer that ticks every 10 msec, but this clock runs slow. For example 1000 ticks with an interval of 10 msec should take 10 wall-clock seconds, but it actually takes more like 20 wall-clock sec (on my PC). I am guessing this is because System.Timers.Timer() is an interval timer that is reset every time it elapses. Since it will always take some time between when the timer elapses and when it is reset (to another 10msec) the clock will run slow. This probably fine if the interval is large (seconds or minutes) but unacceptable for very short intervals.Is there a function on Windows that will trigger a procedure every time the system clock crosses a 10 msec (or whatever) boundary?
UPDATE: System.Timers.Timer() is extremely inaccurate for small intervals.I wrote a simple program that counted 10 seconds several ways:
Interval=1, Count=10000, Run time = 160 sec, msec per interval=16 Interval=10, Count=1000, Run time = 16 sec, msec per interval=15 Interval=100, Count=100, Run time = 11 sec, msec per interval=110 Interval=1000, Count=10, Run time = 10 sec, msec per interval=1000
It seems like System.Timers.Timer() cannot tick faster that about 15 msec, regardless of the interval setting.Note that none of these tests seemed to use any measurable CPU time, so the limit is not the CPU, just a .net limitation (bug?)For now I think I can live with an inaccurate timer that triggers a routine every 15 msec or so and the routine gets an accurate system time. Kinda strange, but...I also found a shareware product ZylTimer.NET that claims to be a much more accurate .net timer (resolution of 1-2 msec). This may be what I need. If there is one product there are likely others.
2012-03-16 19:15:09Z E System.NullReferenceException: Object reference not set to an instance of an object. at System.Timers.Timer.set_Enabled(Boolean value) at System.Timers.Timer.Stop()
Here's the code:
Timer declared as private member variable. Private _myTimer As System.Timers.Timer Initialize timer method.
[code]....
The timer has to have a value or else the Timer.Stop() call would be throwing the exception. This is a sporadic error and I'm just trying to see if anyone has experienced this before or if anyone has any ideas of what could be causing it. It is occuring in a WinForms application in the event handler for the Elapsed event of the Timer, but it is only occuring sporadically on the users computer. I haven't been able to reproduce the error myself.
I have a problem with the Timer class in that there is a chance that a timer would fire right before you call Dispose() since you will probably call Dispose() from some other thread. You may have something like:
Public Sub TimerTick() Handles itsTimer.Elapsed Do Something End Sub
And then from somewhere else in the code, when your app is done, you call
itsTimer.Dispose()
The only way I can think of doing this is:
Public Sub SomeMethod() SyncLock(itsTimer.SynchronizingObject) itsTimer.Dispose()[code]...
This is not a great thing to do esp. since I am holding a lock on an object I am disposing. I can create my own lock and syncLock on that but is there a simple way?
I'm creating a multi-threaded application (although it is not at the moment) which will be connecting to a large number of sockets. I've noticed when a connection cannot be made the connect timeout is rather large, so I am trying to make my own. Here is what I have come up with...
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click CreateSockets(2) AssignSockets(0, "192.168.31.2", 80, False, False) 'shouldn't connect AssignSockets(1, "192.168.1.1", 80, False, False) 'should connect
[code]....
Looking at the timeoutOccured() sub, you can see I'm unsure of how to specify which index to set. Efficiency is important since this will be housing a lot of connections at once. Something else that just came to mind, would .theTimer.Stop reset the tick value on the timer?
I am using timers in a windows service and facing problem that anytime some exception happens ( say i unplug LAN wire from my computer ) service stops running, What i am expecting is that service should keep on running as i am catching generic exception which should catch the exception on one tick event and again work (next tick)when i plug in LAN wire (i am plugging/un plugging ) LAN wire as this service is reading database from LAN so i want to replicate a failover scneario)
My understanding is that thread.join will suspend the execution of code on the calling thread until the spawned thread finishes or is aborted...
With that in mind, I tried this:
For i = 1 to 50 threads = New Thread(AddressOf test) threads.IsBackground = True threads.SetApartmentState(ApartmentState.STA)
[CODE]...
However, the rest of the code runs when the loop finishes, not waiting for all the spawned threads to finish. Since the rest of the code needs the threads to finish (otherwise the rest will error).
When I run my app at first its keeps time accurately for the first minute or so there after it starts loosing seconds, and by the end of the day its minutes behind.I've created a class called ServerTimeTimer that has a timers.timer object that elapses every second and adds a second to a dateTime variable, and a property to retrieve the date time.[code]
If I spawn a thread with ThreadPool.QueueUserWorkItem and that thread does not reference the object that is not thread safe, would it compromise that non-thread safe object? By not thread safe object, I mean a third party interface to a programmable logic controller that has no ability to open simultaneous connections or concurrency support.I suppose I just wanted to be sure that by queuing threads in the same class as my reference to that object, I wouldn't somehow be compromising its thread safeness in a way I didn't realize.
I have a code that basically grab data from a file, split into array and use a FOR loop to input data into a different file. I want to use thread pool to create multiple threads to do a specific task. For example for the array() I want a thread to read the first item in a array and perform the task, a second thread reads the second item and perform the task, a third thread reads the third item and perform the task, etc. How would I add thread pool to something like:
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim data As String
I have about 1000 webrequest created. Each link will navigate to a website and download a picture to place into a picturebox.
The person will then type in what animal is in the picture into a textbox. Then the user will then hit the submit button to send the name of the animal back to the site.
I am going to implement the use of a thread pool to handle the threading portion of those requests.
What is the best method to get my webrequest into the thread pool (listbox, txt file,etc?) and then how can I setup my button to coordniate with the site that is coming out of the pool to the picture box?
My first thought is to create everything on the fly. The picturebox, the textbox, and the submit button, the webrequest to the site for the picture and back again for the result. Something tells me that I will be taking the long way around to get same result.
My second thought is to have a slew of pictureboxes, textboxes, and buttons already on my screen and then when they come out of the pool and into a thread they would assigned a picturebox, textbox, and button if the others are not busy.
I have about 1000 webrequest created. Each link will navigate to a website and download a picture to place into a picturebox.The person will then type in what animal is in the picture into a textbox. Then the user will then hit the submit button to send the name of the animal back to the site.I am going to implement the use of a thread pool to handle the threading portion of those requests.My question is this:What is the best method to get my webrequest into the thread pool (listbox, txt file,etc?) and then how can I setup my button to coordniate with the site that is coming out of the pool to the picture box?My first thought is to create everything on the fly. The picturebox, the textbox, and the submit button, the webrequest to the site for the picture and back again for the result. Something tells me that I will be taking the long way around to get same result.
I've been reading up on multi-threading and just have a couple trivia questions that are ambiguous given my sources:
1) What is the max number of threads in the thread pool? The number 25 is used but I have on reference that says 25 per CPU and another that says 25 per core. I realize that both can be right but before I start making flagrant design decisions I'd like some validation.
2) Let's say I'm in the body of a delegate and I call a function or sub. Does that function/sub remain in the thread or does it revert to the parent thread? I'm guessing the former would be much easier to implement so that's probably what MS did but you just can never tell.
I am going to implements a thread pool to run my application. All of my content is saved under a folder on my desktop.Each of the files are in .txt format. How can I read each .txt from a given folder and then put the .txt file into the thread pool / thread queue?
Im creating a service for a mobile platform and I need to process user messages on a different thread than they were created on to leave the threadpool open.Anyway my App will be using a MySQL database and when it gets a message it will add the message to Another thread pool. But in the sub that procceses the messages I will need to perform query's on the database. So i know i can use a global variable and it will be visible to all threads but is making database operations safe while using a thread pool with a global mysqlconnection?
I'm trying to use the thread pool to download more than one string at a time. But most of the tutorial on threading is in C# or C++ so my knowledge on thread pool is limited.
I keep getting an error "Cross-thread operation not valid: Control 'Listbox1' accessed from a thread other than the thread it was created on." And it still seems to be downloading it one by one to me.
I have a thread pool that send file using ftp protocol. I encapsulated the call for threadpoll with try catch believing that the thrown exception inside the threadpool will be catch by the main thread. Instead the system terminate whenever i throw an exception from inside the threadpool. Also I design the Clsftp.ftpsend class to throw an exception related to ftp error. Basically my design for handling the error is just like the code below.
'Main thread Private Sub BttnStartSending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BttnStartSending.Click try Dim objparam As New ThreadParameter
I'm trying to work out a program where you can set up a variable amount of timers (like egg timers). Each timer works independently of the other (you can stop a timer, reset another, and so on, and the rest are not effected).I thought of using a single timer and then creating a custom egg timer class to handle the countdown, store the current time, etc, and use a collection of these classes inside a timer event (at the tick, do a for each to reduce the countdown on the classes by some milliseconds).Then I got to thinking: all of these egg timer classes in the collection with the for each loop may cause some accuracy loss (say, I add 50 egg timers).
Does anyone think the accuracy loss for updating all of the egg timers would be too adverse? Should I try running them on separate threads (have not thought about how yet), or will that make much difference?
I have a windows application that need to process som quite time consuming jobs. In my first try i did all processing under the form thread. The result was bad response and update of the form due to the heavy jobs.To get around the problem with bad response from the form i created a new class "processing" where i put all the data processing. Then i instanciated a background worker where i in the "doWork" sub created a new instance of "processing".The "processing" class creates a timer from system.timer, and the timer drives the processing.On the Timer event Elapsed the timer starts a new thread from the thread pool.
My problem is now when i want to asynchronously close the background worker (with the corresponding function call what ever it is called ...) there is still a timer thread out there that causes exceptions for me.
1. How can i close my background worker and at the same time have the timer to be stopped?
2. Is there a way to synchronize the timer event so that the timer executes from the background worker thread?
According to the answers to another question, the VB user interface cannot be updated if the thread that created it is busy: hence why big computational jobs usually have to go in a background task.Here's what's mystifying then. I have the following code. It's called over in-process COM, like this
client calls showform() client does loads of work, freezing up its own UI in the process client finishes work, returns to updating its own UI
At step 2, the VB form is there but frozen - you can't interact with it. At step 3, the VB form becomes usable. But why is this? Surely the thread of execution has returned to the client? If the client is somehow handling events for the form, by what magic did it know what events to handle and where to send them?
I have a routine which is controlled by a timer. It works perfectly. The problem is that now, I need to run this routine several times, so I need to start differents threads so that my program doesn't get hung up. I've been trying to start my timer inside a thread, but it doesn't work!
I'm in the Progress of changing a big Application from Singlethread logic to Multithread logic. I'm currently move Dataloading Logic into a sperate thread, and work with callbacks after they are finished. I have Synclocks in place in order to ensure threadsafty. But sonetimes the Synclocks wait even if there is no other thread with the same synclock active. Is there any way to find out what witch thread they are waiting for, and why? BTW, I have FW45 installed, may that be the reason, since it'S a inplace upgrade for FW40?
I have a vb.net application that uses threads to asynchronously process some tasks in a "Scheduled Task" (console application).We are limiting this app to run 10 threads at once, like so:
(pseudo-code)
- create a generic list of 10 threads
- spawn off the threadproc for each one
- do a thread.join statement for each thread to wait for the longest running one to complete.
What i am finding is that if the code called by the threadproc contains any "Debug.Writeline" or "Trace.Traceinformation" statements, the thread hangs. I can see the thread in the Debug - Windows - Threads window, and switch to it, but it highlights the debug.writeline statement and never gets past it. is there something special about the Debug or Trace statements that make them non-thread-safe? Any idea why this would hang things up? If I leave the debug statement in, the thread never completes. If I take the debug statement out, the thread completes in less than 5 seconds.
I feel like the answers I seek are rather obvious so I feel silly for having to ask, but I just can't seem to figure this out (I'm new to threads, and am really only comfortable using them in Java at the moment). I have an Excel Addin application created with VB.NET, and I've noticed that occasionally while it's running some code (it's no one specific block of code) the program execution will just stop. This is especially problematic when I've set ScreenUpdating to False for Excel because the users then have to completely close out of Excel to get ScreenUpdating to true.