Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在Silverlight环境中同步异步请求处理程序_Database_Silverlight_Asynchronous_Scheduling_Semaphore - Fatal编程技术网

Database 在Silverlight环境中同步异步请求处理程序

Database 在Silverlight环境中同步异步请求处理程序,database,silverlight,asynchronous,scheduling,semaphore,Database,Silverlight,Asynchronous,Scheduling,Semaphore,对于我们的高级设计项目,我的团队正在制作一个Silverlight应用程序,它利用图论概念并将数据存储在后端的数据库中。在这种情况下,我们在图中的两个节点之间添加一个链接,然后运行分析来重新分类节点集群。问题在于,这种重新分类非常复杂,涉及到对数据库的多个查询和更新,因此如果同时运行多个数据库实例,它会很快将数据弄乱并中断(通过尝试重新插入已使用的主键)。本质上,它不是线程安全的,我们正在努力使它安全,这就是我们失败并需要帮助的地方:) 创建链接函数如下所示: private Semaphore

对于我们的高级设计项目,我的团队正在制作一个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
}

AddNeeded的所有副本都应等待第一个副本完成,然后才能执行另一个副本。但是,在verifyClusters方法中,它们似乎都在运行并且相互冲突。一种解决方案是强制我们的前端呼叫同步进行。事实上,当我们这样做的时候,一切都很好,所以代码逻辑没有被破坏。但是,当它启动时,我们的应用程序将部署在一个业务环境中,并由内部it人员使用(或者至少这是计划),因此我们将遇到同样的问题。我们不能强制所有客户端在不同的时间提交数据,所以我们确实需要在后端同步数据。感谢您提供的任何帮助,我很乐意提供您可能需要的任何其他信息

我写了一系列文章专门针对这种情况-让我知道这是否适用于您(顺序异步工作流):

第2部分(链接回第1部分):


Jeremy将数据库更新打包到事务中。如果需要升级到表锁

嘿,谢谢你的链接,但我认为你的文章是从前端攻击问题,我们确实需要在后端解决这个问题。我们可以将add_data方法设置为按顺序进行异步调用,但这只能解决这部分问题。我们确实需要后端智能地处理所有asyc调用,以便多个用户同时操作不会导致数据完整性丢失。这是我们无法通过客户端代码实现的。这就是为什么我们尝试使用信号量,我们真的希望有一个简单的解决方案。谢谢你的回复@Eric:你标记的c#和.net地址的受众太多,唯一具体的标记是Silverlight。然而,您的问题与Silverlight没有什么关系。考虑添加与你的问题更相关的标签,以使它引起那些更有可能帮助的人的注意。