Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 142
  • Last Modified:

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

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
GouthamAnand
Asked:
GouthamAnand
  • 2
1 Solution
 
Miguel OzSoftware EngineerCommented:
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
 
GouthamAnandAuthor Commented:
It worked for me. Thanks a lot.
0
 
GouthamAnandAuthor Commented:
It worked for me.Thanks a lot.
0

Featured Post

NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now