title: C# lock(mylocker) not work
body: <p>I have many web service call (asychronous), in callback, I will plot result to Excel. 
  I want to synchronize the plot method. 
  So I use the following, however, from I track down in Visual Studio, every time, lock(locker) is successful, and there are many threads running clearcommentIfany, plot. 
  I can't figure out why this is not working as expected! Thanks </p>
  
  <pre><code>private readonly object locker = new object();
  
  void ProcessPlot()
  {
      lock (locker)
      {
          Debug.WriteLine("currentThreadID: " + Thread.CurrentThread.ManagedThreadId);
          //Helper.Dispatcher.Invoke(new AddClearCommentDelegate(ClearCommentIfAny));
          ClearCommentIfAny();
  
          if (Response.status != Status.COMPLETE)
          {
              ErrorMessage = ManipulateStatusMsg(Response);
              //Helper.Dispatcher.Invoke(new AddClearCommentDelegate(AddCommentToCell));
              AddCommentToCell();
          }
          else // COMPLETE
          {
              // TODO: Convert this into factory pattern
              Debug.WriteLine("ReportBuilder.Dispatcher's address " + Helper.GetAddress(Helper.Dispatcher));
              //Helper.Dispatcher.Invoke(new PlotDelegate(Plot), Response);
              Plot(Response);
          }               
      } 
  }
  
  public void DataRequestJobFinished(DataRequestResponse response)
  {
      try
      {
          if (Request.IsRequestCancelled)
          {
              Request.FormulaCell.Dispose();
              return;
          }
  
          Response = response;
  
          //if (response.status != Status.COMPLETE)
          //{
          //    ErrorMessage = ManipulateStatusMsg(response);
          //}
          //else // COMPLETE
          //{
          //    // TODO: Convert this into factory pattern
          //    PlotDelegate plotDelegate = Plot;
          //    Debug.WriteLine("ReportBuilder.Dispatcher's address " + Helper.GetAddress(Helper.Dispatcher));
          //    Helper.Dispatcher.Invoke(plotDelegate, response);
          //    //Plot(response);                 
          //}
          var t = new Thread(ProcessPlot);
          t.Start();
          //ProcessPlot();
      }
      catch (Exception e)
      {
          ErrorMessage = e.Message;
          MIMICShared.Helper.LogError(e);
      }
      finally
      {
          //TODO: PutReportBuilderInQueue(this);
          ReadyForPlot = true;
          //Request.FormulaCell.Dispose(); move this after plot
          UnityContainer.Resolve&lt;IEventAggregator&gt;().GetEvent&lt;DataRefreshEvent&gt;().Publish(ID);
      }
  }
  </code></pre>