作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有很多 Web 服务调用(异步),在回调中,我会将结果绘制到 Excel。我想同步绘图方法。所以我使用了以下内容,但是,从我在 Visual Studio 中的追踪来看,每次 lock(locker) 都成功,并且有很多线程运行 clearcommentIfany,绘图。我不明白为什么这没有按预期工作!谢谢
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);
}
}
最佳答案
我怀疑你的问题是你的锁是实例成员而不是静态(类型级别)成员。
假设每个线程都有自己的包含类实例,那么它也会有自己的储物柜实例 - 这不是您想要的。
试试这个声明:
private static readonly object locker = new object();
现在包含 static 关键字使该对象实例存在于类型级别,即在您的类的所有实例之间共享。
关于C# 锁(mylocker)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143557/
我有很多 Web 服务调用(异步),在回调中,我会将结果绘制到 Excel。我想同步绘图方法。所以我使用了以下内容,但是,从我在 Visual Studio 中的追踪来看,每次 lock(locker
我已阅读 Microsoft 的 C# 引用中的以下内容: lock("myLock") is a problem because any other code in the process usin
我是一名优秀的程序员,十分优秀!