Look up the BackgroundWorker class: it has a DoWork event that fires on a background thread. Do your work there. It has a ProgressChanged (or something) event that fires on the UI thread. You can cause the ProgressChanged event to fire from the background thread by calling worker.ReportProgress(state, percentComplete).
Another option is to get the SynchronizationContext of the UI (using the static System.Windows.Forms.WindowsFormsSynchronizationContext.Current property), then on the background thread, call syncContext.Post(someDelegateToExecute). The someDelegateToExecute method will execute on the UI thread.
If you are familiar with delegates and the BeginInvoke stuff for UI threads, please use that to update your list box. If your not familiar with it, you should read up on it. There are some good articles on this web site and the help documentation is good on this subject (it comes with examples).
In my class I have to update a property every second until the user stops this task.
I choose a System.Threading.Timer to do the job but the timer runs on its own thread so it cannot update the class property.
Is it possible to implement something like Control class's Invoke method or do I have to choose another approach?
Thanks Luc for your quick response!
I think I have to go in more detail:
I developed a class which accesses my tv card only for radio stations so I do not have a gui thread.
But I would like to send the signal level of the station by calling a method of a com interface every second within the radio class..
Now using a timer who makes the call to the interface, I get an error, this is because the timers thread is not the thread which created the radio class
As far as all com objects and interfaces are part of a windows forms application I was able to use this.Invoke((MethodInvoker)delegate()... to make a call to the com interface method in the timers TimerCallback.
Of course I can solve my problem using a timer in the windows forms application, but I would like to use the timer in my radio class.
if you have a "TVCard" class in C#, it should probably not be concerned by GUI stuff at all;
but it might offer a "Station" property getting/setting the current station selected.
Then an app using the TVCard class could periodically read and display the Station property
using the right thread, and based on its own requirements.
Alternatively, but I dont like this as much, the TVCard class could offer an event that
periodically reports the Station setting; then the app can subscribe to that event,
and must itself take care of the threading issues. The reason I dont like this that much
is that now the TVCard is deciding on how often something happens in the app, normally
the app is in charge !
Of course you could give the TVCard an Interval property as well,
so it really starts to look like a timer.
And yes, you could teach your TVCard to always raise the event on the GUI thread too,
but that would not be needed when an app wants to know but not display the Station setting,
therefore it should not be included in the TVCard ("separation of concerns").
So I would stick with the simple Station propery and let the app do timing and GUI stuff.
I have written simple code in click event of button as below
When I run the application, I got the blank messagebox means it doesn't have the message text "HI" and also doesn't display OK messagebox button. Anybody have any idea. Please guide. Any type of help is appreciated.
in click event of Button1. But when I run the program and click on Button1, I get the messagebox but having no output means I don't get "Hello" text and also don't get OK messagebox button. Why it is so? Any type of help is appreciated
I want to know image dimension but I can't use Image.FromFile method to load image file because it is very slow and I want get image dimention quickly.
my image file format is JPEG
i will thank every one help me
(excuse me i can't speak english correctly)
You will need to read the header information from the file then. This link[^] takes you to the specification. Be aware though that there are *many* different versions of JPEG, so you will need to test this thoroughly.
thank you a lot.
but this site does not offer any C# code and I can't find image dimension obviously in it's jpeg header format.
thank you again.
if any one have more simple answer please send it. thank you again.
The site isn't intended to show you C# code. It's the jpeg format only.
What you need to do is read in the file, a byte at a time until you read in the Xdensity and Ydensity bytes (each of which is two bytes). If you read in the first 18 bytes, the 14th will tell you the JPEG unit, the next two will be the X density and the last two will be the Y density.