Solved

How to make 2 threads run safely same block of code one after the other?

Posted on 2015-01-21
3
137 Views
Last Modified: 2015-01-21
Hi,

I have 3 threads running in my windows service application. If any exception in any of the threads, they have to send the email.
Below is my email code.
public static void SendMail(string machineName, string serviceName, string threadName, string errrorDesc)
        {
            Object syncLock = new Object();

            lock (syncLock)
            {
                try
                {
                    mm.Subject = _eMailTpltXML.Root.Element("Subject").Value.Replace("##MachineName##", machineName);
                    mm.Subject = mm.Subject.Replace("##ServiceName##", serviceName);
                    mm.Subject = mm.Subject.Replace("##ThreadName##", threadName);

                    mm.Body = _eMailTpltXML.Root.Element("Body").Value;
                    mm.Body = mm.Body.Replace("##MachineName##", machineName);
                    mm.Body = mm.Body.Replace("##ServiceName##", serviceName);
                    mm.Body = mm.Body.Replace("##ThreadName##", threadName);
                    mm.Body = mm.Body.Replace("##ErrorDesc##", errrorDesc);

                    sc.Send(mm);
                    Logger.log.Info(serviceName + " - Email has been sent.");
                }
                catch (Exception ex)
                {
                    Logger.log.Error("SendEmail - " + ex.Message);
                }
            }
        }

Open in new window


If the error occurs more than 2 threads at the same time, only one thread is able to send the email. Other 2 are failing and saying - "An asynchronous call is already in progress. It must be completed or canceled before you can call this method."

what is the best way to handle and make the 3 thread use the same block of code without any problems? (if the error occurs in 3 thread at the same time)
0
Comment
Question by:GouthamAnand
  • 2
3 Comments
 
LVL 35

Accepted Solution

by:
Miguel Oz earned 500 total points
ID: 40563016
The lock object must be shared among your instances. One possible solution is to declare it as static (global variable)
public static Object syncLock = new Object();

Open in new window

and remove line 3 from your current posted code.

Note: Line 3 (syncLock = new Object())  is creating a new instance every time you call your method, thus it is not locking because the instances are different.
0
 

Author Comment

by:GouthamAnand
ID: 40563209
It worked for me. Thanks a lot.
0
 

Author Closing Comment

by:GouthamAnand
ID: 40563212
It worked for me.Thanks a lot.
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Hey Audio! 3 29
Reading the web config for a running service on Windows 10 16 41
Hey!!!! 1 21
DataTables + iCheck + pagination Issue 2 23
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question