【发布时间】:2010-04-09 15:42:52
【问题描述】:
对于我们的高级设计项目,我的小组正在制作一个 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 几乎没有关系。考虑添加与您的问题更相关的标签,以引起更有可能提供帮助的人的注意。
标签: database silverlight asynchronous scheduling semaphore