2012-04-13 62 views
7

我有很多web服务调用(asychronous),在回调中,我会将结果绘制到Excel中。 我想同步绘图方法。 因此,我使用以下方法,但是,从我在Visual Studio中追踪,每次锁(locker)都成功,并且有许多线程运行clearcommentIfany,plot。 我不明白为什么这不按预期工作!由于C#锁定(mylocker)不起作用

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<IEventAggregator>().GetEvent<DataRefreshEvent>().Publish(ID); 
    } 
} 
+0

这可能会帮助您 > http://stackoverflow.com/questions/5053172/why-does-the-lock-object-has-to-be-static – Sadaf 2012-04-13 15:23:58

回答

23

这里我怀疑你的问题是,你的锁是一个实例成员,而不是静态的(类型级别)的成员。

假设每个线程都有自己的包含类的实例,那么它也会有自己的锁柜实例 - 这不是你想要的。

试试这个声明代替:

private static readonly object locker = new object(); 

static关键字的加入使得现在这个对象实例在类型级别的存在,即在您的类的所有实例共享。

3

您将必须使对象static

private static readonly object locker = new object(); 

当前,该类(因此每个线程)的每个实例都有自己的锁柜实例。