7

I am writing a Windows Service (using C# .NET 3.5 VS2008) and my requirement is:

  • When the Windows Service start - it performs record check operation (in Database) @ every 30 second interval (I have used a timer for this)

  • If the appropriate record was found in the database - then it starts multiple threads and performs the required operation (that may be network operation or Database operation).

The number of multiple threads also depends on the amount of records found (like if 10 record found then starts 5 threads and for 20 records start 10 threads etc...) How to design/code for these multiple threads?

Example: 10 records found in the database, I want to start 5 threads for first 5 records which may perform network operation... out of 5 threads whichever thread completes his job - will start processing for next the record (i.e Record number 6, 7 ... 10)

Please suggest best possible solution for the above case.

4
  • This question is probably better for SO
    – softveda
    Jun 2, 2011 at 8:06
  • @Pratik - I'm not so sure about that. There's not a specific coding issue. It's a design question which is on topic for here.
    – ChrisF
    Jun 2, 2011 at 8:33
  • His requirements cannot be meet. There are very few computers on the market that the capability to run 12 threads concurently. His design requirements are not realistic.
    – Ramhound
    Jun 2, 2011 at 12:26
  • 1
    @Ramhound: calling ThreadPool.GetMaxThreads() on my year old i3 desktop reports 1023 worker threads and 1000 completion port threads... Considering that my machine is also running 50+ processes at any given time, what do you mean that there are few computers that can run 12 threads concurrently? Jun 2, 2011 at 13:11

3 Answers 3

4

I would recommend using Parallel.Net and PLINQ instead of explicit multi-threading. It's easier to manage, is more lightweight and will adapt itself to the numbers of core's you have

Learning resources

http://msdn.microsoft.com/en-us/concurrency/bb895950.aspx

2

on service start, launch a thread to run your timer process

on service end, kill all open threads

beware that any unhandled exception in your process will silently kill the timer thread

throttle the number of open threads allowed using a private list, to avoid flooding the service

you might find my SafeThread class useful for this

3
  • With the advent of TPL (.NET 4 onwards) Nov 15, 2015 at 23:15
  • The SafeThread class is a great idea! Quick query: With the advent of TPL (.NET 4 onwards) and thus the Task construct, I believe in most situations Task is the way to go rather than creating Threads - what do you think? Nov 15, 2015 at 23:26
  • @dotnetguy: I don't know, I've not used .NET in a while; perhaps this will help stackoverflow.com/questions/4130194/… Nov 16, 2015 at 18:05
1

Initial thoughts: too many threads are bad for you. Unless the thread are IO bound (ie stuck waiting on IO operations for a large amount of their time) then you should have 2 threads per CPU as a rough rule-of-thumb.

As a reuslt, create a thread pool of a fixed number of threads, and simply reuse them. The design of the pool requires a semaphore - set the semaphore count to be the number of threads in the pool, allow through as many requests as the semaphore counts up to, then the semaphore will block until the threads complete (when this happens, you decrement the semaphore count) which will allow the next request through. This works because a semaphore is simply a "multi-lock" mutex. It lets through as many calls as you've specified and then it blocks. A mutex is in fact a semaphore with a count of 1.

2
  • While I mostly agree, why would you suggest a custom thread pool instead of the .net thread pool? You can still use a semaphore for throttling. Also, do you have any reference material for the restriction of threads. For slightly long lived threads, I'm pretty sure >2 threads/cpu is not an issue but I could be completely wrong. Jun 2, 2011 at 13:14
  • I am reading few documents and learning threading stuff a lot... I have question regarding Thread Pool. 1) Is Thread Pool is good option for executing multiple network operations (Http post operations)? 2) How Thread Pool executes each Thread (i.e If i assign 10 operation to Thread Pool - does it starts all 10 operations at the same time or it works linearly (one by one) ) Thanks for help and support.
    – Ankit Shah
    Jun 3, 2011 at 6:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.