I have a windows service which sends out emails after a lengthy process. This service keep on fetching email data from DB table, whenever there is a table entry and process it and will send it out.
Currently it is a multi thread application where we configure Thread count up to 25 in production server(which is solely for this purpose) as this is meant to run 24x7x365 . But we see only 2 active threads. What could be the reason?
Also I wish to change the threading code here using thread pool or TPL. Could you please suggest me a better way to handle this scenario ?
Thanks in Advance !
//Sample code below
Thread[] threads;
int ThreadCount = 25;
private void StartProcess()
{
Create new threads
if (Threads == null)
{
// Create array of threads based on the configuration
threads = new Thread[ThreadCount];
for (int i = 0; i < ThreadCount; i++)
{
Thread[] threads[i] = new Thread(new ThreadStart(SendEmail));
threads[i].Start();
}
}
else
{
resume it if exists
for (int j = 0; j < threads.Length; j++)
{
if (threads[j].ThreadState == Threading.ThreadState.Suspended)
{
threads[j].Resume();
}
}
}
}
public void SendEmail()
{
while (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.Running)
{
// send email code
Thread.Sleep(duration);
}
}
Using the new Task Parallel Library (TPL) is a piece of cake. It's so much simpler and easier than the old way.
You can store your thread count in the App.config file and do it this way:
using System.Threading.Tasks;
int threadCount;
int.TryParse(ConfigurationManager.AppSettings["ThreadCount"], out threadCount);
var po = new ParallelOptions { MaxDegreeOfParallelism = threadCount, TaskScheduler = null };
// Get your list of emails here
lstEmail = GetEmails();
// Multi-thread - process each email
Parallel.ForEach(lstEmail, po, plan =>
{
// Everything in here will be multi-threaded using the TPL
}
Also, just a quick architecture note - you could also set up a timer in your Windows Service and have the service check for new emails every n minutes - if any emails exist you could launch a separate multi-threaded .NET console app that processes the emails:
using System.ServiceProcess;
public class WinService : ServiceBase
{
private readonly Timer _timer = new Timer();
protected override void OnStart(string[] args)
{
Logger.Info("Service Started");
// Raise event
_timer.Elapsed += timer_Elapsed;
// 1000 is the number of milliseconds in a second
// 60 is the number of seconds in a minute
_timer.Interval = 1000 * 60;
_timer.Enabled = true;
_timer.Start();
}
// Handles event, every n minutes
private static void timer_Elapsed(object sender, EventArgs e)
{
LaunchEmailEngine();
}
private static void LaunchEmailEngine(string args)
{
var startInfo = new ProcessStartInfo
{
FileName = Helper.GetAppSetting("EngineLocation"),
Arguments = args
};
Process.Start(startInfo);
}
}
None
0 Points
1 Post
Threadpool or TPL for a long running tasks
Apr 28, 2015 07:56 AM|samk1984|LINK
I have a windows service which sends out emails after a lengthy process. This service keep on fetching email data from DB table, whenever there is a table entry and process it and will send it out.
Currently it is a multi thread application where we configure Thread count up to 25 in production server(which is solely for this purpose) as this is meant to run 24x7x365 . But we see only 2 active threads. What could be the reason?
Also I wish to change the threading code here using thread pool or TPL. Could you please suggest me a better way to handle this scenario ?
Thanks in Advance !
//Sample code below
Thread[] threads;
int ThreadCount = 25;
private void StartProcess()
{
Create new threads
if (Threads == null)
{
// Create array of threads based on the configuration
threads = new Thread[ThreadCount];
for (int i = 0; i < ThreadCount; i++)
{
Thread[] threads[i] = new Thread(new ThreadStart(SendEmail));
threads[i].Start();
}
}
else
{
resume it if exists
for (int j = 0; j < threads.Length; j++)
{
if (threads[j].ThreadState == Threading.ThreadState.Suspended)
{
threads[j].Resume();
}
}
}
}
public void SendEmail()
{
while (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.Running)
{
// send email code
Thread.Sleep(duration);
}
}
Thread Threadpool parallel
Member
670 Points
188 Posts
Re: Threadpool or TPL for a long running tasks
Apr 28, 2015 01:14 PM|csharpgreg|LINK
Hello Samk1984! Thanks for your post!
Using the new Task Parallel Library (TPL) is a piece of cake. It's so much simpler and easier than the old way.
You can store your thread count in the App.config file and do it this way:
Also, just a quick architecture note - you could also set up a timer in your Windows Service and have the service check for new emails every n minutes - if any emails exist you could launch a separate multi-threaded .NET console app that processes the emails:
Regards!
Thread Threadpool parallel