Question

Multi-Threading in a Windows Service

Asked by: briankrebs

Hi everyone,

More or less what I'm doing is fetching all records from a table called Mailboxes every 30 seconds (using a System.Timers.Timer) and performing the same exact db operations on each.  The problem is, for some mailboxes the operations can take a long time, so long that they are still running when the timer elapses again.  This has caused some strange problems in the backend.

What I want to do now is have a certain number of threads running concurrently, each processing only 1 mailbox at a time.  When processing is complete on one mailbox, I want the thread to fire off an event letting the main thread know it can start processing the next mailbox in queue, until all mailboxes are processed.

The processing itself is encapsulated in a single class with 2 properties, which must be set before starting the thread, a method that should be passed as the delegate to the worker thread, and an event called FinishedProcessing with one argument, which is the mailbox that has finished processing.

I have some code in place, but I can't figure out how to let a worker thread sleep once processing is complete, and then have the main thread reuse that worker thread to process the next mailbox in queue.  What is the best way to accomplish this?

Thanks in advance,

Brian

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2005-09-14 at 12:34:35ID21561656
Tags

service

,

thread

,

windows

Topic

Microsoft Visual Basic.Net

Participating Experts
2
Points
250
Comments
17

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. worker thread stops surprisingly
    Microsoft Visual C++ 6.0 SP4, MS Windows 2000 Server. I have a setup application that starts a worker thread after all user input has been done. The worker thread does some downloading from the internet, and stops surprisingly. The code for creating the worker thread: CWin...
  2. worker thread
    I have created a worker thread that "polls" a hardware device to determine if some data are ready. This worker thread is created with the lowest priority possible. When this worker thread is running (and it may be running all the time) the CPU cycles on the performa...
  3. Messaging between worker threads and main thread
    Hi, I don't have much experience programming in a multi threaded environment and I am looking for some straight forward documentation on setting up messaging between the main thread and worker threads (too make a really long story short....I am working on a main thread schedu...
  4. Named Pipe encapsulation component?
    Do you know about a free component which encapsulates the API's Named Pipe functions? I'd like to have something like the TCP/IP socket components, but based on pipe rather than on TCP/IP communication.

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: WorkingJourneymanPosted on 2005-09-14 at 13:20:55ID: 14884497

Sounds like a job for a thread pool, which is a facility built in to .Net. There are probably loads of PAQs on EE dealing with the subject. Just search on "thread pool" or "threadpool".

 

by: jmwheelerPosted on 2005-09-14 at 14:42:28ID: 14885248

Read record information in to some time of storage (array, queue, etc.)  called myStorage.  Then create a subroutine called Process() like the pseudo code below.

Public thr1, thr2, thr3 As New System.Threading.Thread(AddressOf Process)
Public myRecords 'Declare whatever type of storage you choosse to use.

Sub Main()
   thr1.Start
   thr2.Start
   thr3.Start
End Sub

Sub Process()
beginThread:    
   'Synclock allows you to block access to an object from other threads until you release it
   Synclock myRecords
      'See if there is still a records left in myRecords to process
      'If a record is available
      'Get record information and remove the record from myRecords so that it can not be accessed by other threads once myRecords is released
   End Synclock

   If not (record is nothing) then
      'Process Record
   End if
   System.Threading.Thread.Sleep(2000)    'Will make current thread sleep for 2 seconds, adjust as necessary
   GoTo beginThread      'Will start process all over again
End Sub

 

by: briankrebsPosted on 2005-09-15 at 14:09:06ID: 14893487

Thanks for the replies guys.  I have given up on low-level threading for now.  Instead I'm trying to use the ThreadPool class without much luck.  This is what I have so far:

MailProcessor Class - Does the bulk of the work
  Mailbox Property - Must be set with a Mailbox object
  UsedCachedRules Property - Used for various things
  BeginProcessing Method - The function I want to call asynchronously from each thread... does a lot of work ranging from less than a second to a few minutes depending on the mailbox.

So first I declare and start a Timers.Timer object when the service starts to fire off every 30 seconds.  Everytime the Elapsed event is raised, I grab all of the mailboxes from the DB that are NOT currently being processed, translate them into  Mailbox objects, and mark them all as "currently being processed" in the DB.

Then, I have a loop that loops through each Mailbox in the MailboxesCollection and performs the following tasks:

1. Instantiate a new MailProcessor object (as 'proc')
2. Set the Mailbox property to the next Mailbox in the collection
3. Set the UsedCachedRules property to false
4. Executes the following line:

ThreadPool.QueueUserWorkItem(AddressOf proc.BeginProcessing)

The problem is, it looks like the BeginProcessing method is never actually executed.  I have logging statements (using my own logging function) before the thread is spawned and also inside of the MailProcessor's BeginProcessing method.  The only debugging text being written to the log is coming from the main thread (before the thread is spawned and afterward).

Also, no execeptions are being thrown.  Not sure what to make of it.  I can post some actual code samples if necessary.

Thanks,

Brian

 

by: WorkingJourneymanPosted on 2005-09-15 at 15:54:24ID: 14894054

Make sure to put a limit on the number of threads your program spawns. There will be a point at which making new threads no longer increases overall performance. Start with 2.

 

by: briankrebsPosted on 2005-09-15 at 19:02:33ID: 14894943

I thought that you couldn't set a maximum number of concurrent threads with the ThreadPool class.

 

by: briankrebsPosted on 2005-09-15 at 19:03:11ID: 14894946

Also, more importantly, do you have any advice on the issue at hand?

 

by: WorkingJourneymanPosted on 2005-09-16 at 01:35:50ID: 14896317

No, not without calling your program design into question first.

 

by: briankrebsPosted on 2005-09-16 at 06:38:35ID: 14897836

By all means please do.  My number one priority is to get this thing to work.

I wrapped my "mail processing" functionality into a separate MailProcessor class because I read that it was the only way to pass parameters to a thread delegate.  So I created my two necessary parameters as properties of my class, and the delegate as a method.

I understand now that with the ThreadPool class, you can pass parameters via the "state object".  Maybe the fact that the main functionality is wrapped into a separate class, which is being instanciated once for each thread is the issue?  I would use just one instance for all threads, but it does so much, the synclocks would be too numerous I think.

However, if that's what's causing the execution to never enter the delegate function, I'll gladly spend some time adding the synclocks.  Any ideas?

Thanks again,

Brian

 

by: WorkingJourneymanPosted on 2005-09-22 at 05:21:33ID: 14935971

Sorry for the delay.

Unfortunately, I can't answer the question as to why your delegate isn't being called. I'll need to see more code to help you diagnose that (if it is still a problem).

My criticism of your stated design is simply the lack of any limitation on the number of concurrent threads that may be spawned. You are correct that the ThreadPool class doesn't provide a facility to dynamically set the maximum number of threads. Regardless, if you are planning to have multiple threads performing database access, there will be a point at which the threads will spend more time contending with each other than doing what you want which could cause all sorts of problems, not least with users potentially being locked out of mailboxes!

 

by: WorkingJourneymanPosted on 2005-09-22 at 18:31:59ID: 14941526

briankrebs,

May I point you at another question I'm working on? http:Q_21562582.html

It's a code sample for a multi-threaded Windows service in VB.Net. I'd appreciate you giving it a look over if you find time. Thanks.

 

by: briankrebsPosted on 2005-09-22 at 19:52:27ID: 14941741

I'll definitely do that.  I think I'm going to end up ditching the ThreadPool class.  Doesn't seem like it's built to do what I'm attempting to accomplish.  I haven't replied here in a few days because the priority of this particular project has dropped significantly, however, it still needs to be done sooner than later.  Thanks for your replies.

Brian

 

by: WorkingJourneymanPosted on 2005-09-22 at 20:54:50ID: 14941925

You're most welcome. I'll stay subscribed.

 

by: briankrebsPosted on 2006-01-17 at 08:21:59ID: 15720588

Thanks Working Journeyman.  Unfortunately, other projects took priority over this one and it doesn't look like I'll be able to resume anytime soon.  You did, however, help me to understand more some of the concepts of threading and I believe I know now how to accomplish the requirements.  You've been a great help.

Brian

 

by: WorkingJourneymanPosted on 2006-01-17 at 08:58:11ID: 15720941

Again, you're most welcome, except for keeping me waiting FOUR MONTHS for payment. I don't care what your priorities are - I want to be paid promptly. Please don't delay payment without good reason as it pisses me off and makes other people think they can also do the same, which pisses me off so much more that it is the reason I no longer participate on Experts Exchange. I don't get paid quickly enough.

In the real world I'd sue your ass off. You don't want to be sued by professionals. We always, always win and it always, always hurts.

Consider yourself spanked. Please come again. :)

Paul

 

by: WorkingJourneymanPosted on 2006-01-17 at 09:01:34ID: 15720973

Oh, I should point out that I make part of my living as a professional programming tutor. That may explain why not getting paid pisses me off so much...

 

by: briankrebsPosted on 2006-01-17 at 12:29:51ID: 15723018

I sincerely hope you're only kidding.  For one, and most importantly, I'm not sure if they told you, but "expert points" don't have any monetary value.  How can they have any value at all when there exists an unlimited abundance?  Secondly, I'm not sure of your country of residence, but here in the great USA, professionals very rarely win in petty suits like the imagined one you are referring to.  Trust me.  Even if the suit is "won", the litigation process leeches away any margin you may have garnered.  That is why there are so many collections agencies.  Much higher propensity for a positive ROI.

Anyway, it's not my place to school you in economics or a/r management.  I think once the time is again available, I'll have one recursive wrapper method being called by each thread so the job is executed until I tell it that it's checked all of the mailboxes.  I'll spawn a user-defined number of threads at the very beginning to guard against the unproductive "thread collision" you warned me of.

You've been helpful and are finally awarded your commission.  Don't spend it all in one place! :)

Brian

 

by: WorkingJourneymanPosted on 2006-01-17 at 16:59:10ID: 15724975

Brian,

No, I'm serious. However, let me be clear that you have in no way caused me any offence or inconvenience, not have I any wish to cause such to you. This is a professional matter. You're not the one who caused me to stop donating to Experts Exchange - no one is.

The very notion with which you defend yourself, "expert points don't have any monetary value", is the reason I stopped donating to Experts Exchange. It costs me too much and the rewards are too late in coming to justify the expense. Expert Points do have a monetary value and I can prove it.

Now, it's not my place to school you in economics. However, I shall on request, on my own blog. It would be unprofessional of me to do so here.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...