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

Posted on 2015-01-21
Medium Priority
Last Modified: 2015-01-21

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)
                    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);

                    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)
Question by:GouthamAnand
  • 2
LVL 36

Accepted Solution

Miguel Oz earned 2000 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.

Author Comment

ID: 40563209
It worked for me. Thanks a lot.

Author Closing Comment

ID: 40563212
It worked for me.Thanks a lot.

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Native ability to set a user account password via AD GPO was removed because the passwords can be easily decrypted by any authenticated user in the domain. Microsoft recommends LAPS as a replacement and I have written an article that does something …
This article describes and provides a custom-made tool I wrote to give businesses a means of identifying commercial music content, without having to expend too much effort. Business recordings are easily identified from possibly illegal music files …
If you are looking for an automated solution for backup single or multiple Office 365 user mailboxes to Outlook data file, then you can use Kernel Office 365 Backup & Restore tool. Go through the video to check out the steps to backup single or mult…
In the video, one can understand the process of resizing images in single or bulk. Kernel Bulk Image Resizer is an easy to use tool for resizing large number of images. One can add and resize multiple images with this tool in single go. The video sh…

597 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