I’m trying to work with Threadding and it seems to me like it’s suspiciously difficult (I’m probably doing it wrong).
I want to load a file inside a BackgroundWorker and while that happens, “send” each new line to a separate Thread (not bgWorker). I’m using BlockingCollection and Add() each line, then I want to Take() them and process them in another thread.
Now, everything is straightforward with the BgWorker; but why is it impossible(isn’t it?) to just declare a new thread in Form1.cs and have it perform like the BgWorker? In other words, why must you create a separate WorkerClass ( http://msdn.microsoft.com/en-us/library/7a2f3ay4(VS.80).aspx )?
I’m asking this because, you can access your BlockingCollection fine from within the BackgroundWorker, but you can’t do it from a separate WorkerClass (since it’s a plain vanilla separate class). (So what’s the point of the BlockingCollection then if you can’t use it for what it’s meant?)
Also, BgWorkers have a ReportProgress(...) event/method. As far as I know, if you use that msdn example, you don’t have squat in your Thread.
What am I missing here? Please help.
PS: Before you jump and tell me that It’s not in any way more efficient to send lines to another thread, know that I’m doing this as a learning exercise. Trying to figure out how Threads work in C# and how you sync/communicate between/with them (and/or bgWorkers).
To answer your question in the title, yes “normal” threads can act like
BackgroundWorkerthreads. You just have to create more of the wiring code yourself.I wrote a simple application for scanning my music collection using a manually created thread. The main body of the thread is a method that loops over all of the folders under a specified root and fires an event each time it encounters a folder that contains some mp3 files.
I subscribe to this event in the main form of my application and update a DataGridView with the new information.
So the thread is kicked off by the following code:
The method supplied to
ThreadStartdoes some housekeeping and then calls the method that does the work:When this method finishes a final
LibraryFinishedevent is fired.I subscribe to these events in the main form:
and in these methods add the new album to the grid:
and finish off (which reenables buttons etc.):
As you can see this is a lot of work which would be a whole lot simpler if I used a
BackgroundWorker.