gpt4 book ai didi

c# - 如何跨网络实现锁定

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:43 25 4
gpt4 key购买 nike

我有一个桌面应用程序。在此应用程序中,有许多用户可以打开和处理的记录。如果用户单击一条记录,程序将锁定该记录,这样其他人就无法使用它。如果记录已经被锁定,那么用户仍然可以查看它,但它将是只读的。我们本地网络上的许多用户都可以打开和处理记录。

我的第一个想法是使用数据库来管理记录上的锁。但我不确定这是如何或是否是最好的方法。我可以使用任何编程模式或现成的解决方案吗?

最佳答案

我已经为访问数据库的 WPF 应用程序实现了一个类似的系统,但是我无法再访问源代码,我将在这里尝试解释。我采取的路线与使用数据库有些不同。使用 Duplex WCF service您可以在客户端连接的某个地方(即数据库服务器)托管服务。需要了解的关键事项:

  • 您可以通过使用某种数据类型并确保每个行类型具有相同类型的主键(例如 long)来使此服务通用。在这种情况下,您可以拥有类似于以下的签名:bool AcquireLock(string dataType, long id)或替换 bool/long通过 bool[]long[]如果用户频繁修改大量行。
  • 在服务器端,您必须能够快速响应此请求。考虑将数据存储在类似于 Dictionary<String (DataType), Dictionary<User, HashSet<long>> 的内容中其中根字符串是数据类型。
  • 当有人连接时,他可以收到给定数据类型的所有锁的列表(例如,当屏幕打开时锁定该类型的记录),同时还注册以接收给定数据类型的更新。
  • 客户端与服务器之间的套接字连接定义了用户“已连接”。如果套接字关闭,服务器会释放该用户的所有锁,并立即通知其他人该用户已失去锁,使记录再次可供编辑。 (这包括用户断开连接或终止进程等场景)。
  • 为避免并发问题,请确保用户在允许他进行任何更改之前获得锁定。 (例如 BeginEdit,首先通过在您的 View 模型上实现 IEditableObject 来检查服务器)。
  • 当锁被释放时,客户端会告诉服务器他是否对该行进行了更改,以便其他客户端可以更新相应的数据。当套接字断开连接时,假设没有任何变化。
  • 要添加的不错的功能:在向用户提供锁列表/更新时,还要提供用户 ID,以便人们可以看到谁在做什么。

与提供处理乐观并发问题的方法相比,这种形式的“实时并发”提供了更好的用户体验,并且在技术上也更容易实现,具体取决于您的场景。

关于c# - 如何跨网络实现锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30657752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com