【问题标题】:Synchronizing Asynchronous request handlers in Silverlight environment在 Silverlight 环境中同步异步请求处理程序
【发布时间】: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


【解决方案1】:

我写了一个系列来专门解决这种情况 - 让我知道这是否适合您(顺序异步工作流):

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

杰里米

【讨论】:

  • 嘿,感谢您的链接,但我认为您的文章是从前端解决问题,而我们确实需要在后端解决这个问题。我们可以设置 add_data 方法来按顺序进行异步调用,但这只能解决问题的一部分。我们确实需要后端智能地处理所有的异步调用,以便多个用户同时操作不会导致数据完整性丢失。这是我们无法通过客户端代码实现的。这就是我们尝试使用信号量的原因,我们真的希望那里有一个简单的解决方案。感谢您的回复!
【解决方案2】:

将您的数据库更新包装在事务中。必要时升级为表锁

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多