2010-04-09 140 views
0

对于我们的高级设计项目,我的团队正在制作一个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人员使用(或者至少是这个计划),所以我们会遇到同样的问题。我们不能强制所有的客户端在不同的时间提交数据,所以我们真的需要在后端实现同步。感谢您提供的任何帮助,我很乐意提供您可能需要的任何其他信息!

+0

@Eric:您将c#和.net地址标记得太广泛,唯一具体的标签就是Silverlight。然而,你的问题与Silverlight很少有关。考虑添加与您的问题更相关的标签,以使其更容易提供帮助。 – AnthonyWJones 2010-04-10 14:21:55

回答

0

我写了一系列专门针对这种情况 - 让我知道,如果这对你的作品(顺序异步工作流):

第2部分(有一个链接回到第1部分): http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-part.html

Jeremy

+0

嘿,感谢您的链接,但我认为您的文章正在攻击前端的问题,我们真的需要在后端解决这个问题。我们可以设置我们的add_data方法来按顺序进行异步调用,但这只能解决问题的这一部分。我们确实需要后端智能地处理所有asyc调用,以便多个用户同时运行不会导致数据完整性丢失。这是我们无法通过客户端代码实现的。这就是为什么我们试图使用信号量,我们真的希望有一个简单的解决方案。感谢您的回复! – 2010-04-09 20:35:24

0

将您的数据库更新包装在一个事务中。必要时升级到桌面锁