对于我们的高级设计项目,我的团队正在制作一个Silverlight应用程序,该应用程序利用图论理念并将数据存储在后端的数据库中。我们有一种情况,即在图中的两个节点之间添加一个链接,然后运行分析以重新对我们的节点集群进行分类。问题是这种重新分类非常复杂,涉及到数据库的多个查询和更新,所以如果它的多个实例立即运行,它会很快地破坏数据并破坏(通过尝试重新插入已经使用的主键)。基本上它不是线程安全的,我们正在努力使其安全,这就是我们失败并需要帮助的地方:)。在Silverlight环境中同步异步请求处理程序
的创建链接的功能如下:
private Semaphore dblock = new Semaphore(1, 1);
// This function is on our service reference and gets called
// by the client code.
public int addNeed(int nodeOne, int nodeTwo)
{
dblock.WaitOne();
submitNewNeed(createNewNeed(nodeOne, nodeTwo));
verifyClusters(nodeOne, nodeTwo);
dblock.Release();
return 0;
}
private void verifyClusters(int nodeOne, int nodeTwo)
{
// Run analysis of nodeOne and nodeTwo in graph
}
addNeed的所有副本必须等待才能回来另一完成可以执行的第一个。但是,他们似乎都在运行并且在verifyClusters方法中彼此冲突。一种解决方案是强制我们的前端呼叫同步进行。事实上,当我们确保一切正常时,代码逻辑不会被破坏。但是当它启动时,我们的应用程序将被部署在一个业务环境中并被内部IT人员使用(或者至少是这个计划),所以我们会遇到同样的问题。我们不能强制所有的客户端在不同的时间提交数据,所以我们真的需要在后端实现同步。感谢您提供的任何帮助,我很乐意提供您可能需要的任何其他信息!
@Eric:您将c#和.net地址标记得太广泛,唯一具体的标签就是Silverlight。然而,你的问题与Silverlight很少有关。考虑添加与您的问题更相关的标签,以使其更容易提供帮助。 – AnthonyWJones 2010-04-10 14:21:55