.NET Remoting线程锁定机制

时间:2010-01-22 23:48:15

标签: .net multithreading remoting thread-safety

我有一个紧迫的问题,我希望你们都可以帮助我。我会尽我所能来解释它。

我正在扩充一个使用.NET远程处理的系统,以允许从瘦客户端到执行所述调用的服务器的数据库调用。服务器本身安装了数据访问组件,因此它实际调用数据库,并将数据行返回给瘦客户端。

我刚刚在这些模块中添加了交易。我想使这个线程安全,如果客户端线程A启动数据库事务,客户端线程B将无法访问客户端线程A的事务。在此期间,没有必要允许客户端线程B拥有它自己的事务,只需要我不允许客户端线程B使用客户端线程A的事务。

只有一个对远程对象的引用,它们都共享,并且由于我不会进入的底层架构,我无法改变它。所有Transaction对象都存储在此远程处理对象的服务器上。

除了可能将客户端线程信息与每个单独的事务调用一起传递之外,我认为这样做没有好办法,这对于我的按下时间轴是不可行的。 :-(也许如果远程处理对象可以访问调用客户端线程,那么我不必在每次调用时都传递线程信息,这使得这是可行的。

如果有某种方法可以将客户端线程与远程处理进程线程相关联,我认为这样可以解决问题,但是没有关于这样的事情的文档。

我希望我解释得这么好。非常感谢所有帮助。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我不是100%确定是否可以这样做,但使用CallContext可能有所帮助。简而言之,CallContext是一个可以远程连接到服务器的带外数据,请参阅此博客here以获取示例。如果您不了解带外(oob)是什么,请在维基百科上查看here。这是另一个具体的例子here。这可能会给你一些线索。

答案 1 :(得分:1)

你想要做的事听起来有点奇怪,所以让我看看我是否理解:

  • 您在服务器端使用单例,这就是每个客户端在服务器上只有一个线程的原因。

  • 假设交易过程需要很长时间(几秒到几分钟),其他客户必须等到第一个客户端完成。

我想,但我不确定每个客户的电话是否正在创建自己的线程。如果这是真的,那么当远程对象需要进行线程安全调用时,只需实现一些“锁定”调用即可。锁定是昂贵的,如果事务需要几秒钟,那么另一个人等待可能会超时(eeK!)

这是为(See MSDN)构建TransactionScope对象的东西。如果不了解有关解决方案的更多信息,我就无法提供帮助。

抱歉......我不知道这是否有用。