【问题标题】:.NET Remoting thread locking mechanism.NET Remoting 线程锁定机制
【发布时间】:2010-01-22 23:48:15
【问题描述】:

我有一个紧迫的问题,希望大家能帮助我。我会尽量解释清楚。

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

我最近刚刚在这些模块中添加了事务。我想让这个线程安全,如果客户端线程 A 启动数据库事务,客户端线程 B 将无法访问客户端线程 A 的事务。同时不需要让客户端线程B拥有自己的事务,只需要我不允许客户端线程B使用客户端线程A的事务。

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

我看不出这样做的好方法,除了可能将客户端线程信息与每个事务调用一起传递,这在我紧迫的时间表中是不可行的。 :-( 如果远程处理对象可以访问调用客户端线程,那么我就不必在每次调用时都传递线程信息,这使得这可行。

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

我希望我解释得足够好。非常感谢所有帮助。提前谢谢你。

【问题讨论】:

    标签: .net multithreading remoting thread-safety


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议。我不知道 CallContext ,这对我有很大帮助。我只是不知道如何确保始终传递线程信息。看来我需要确保为每个调用线程设置线程上下文,这对于我的时间线可能是不可行的。在远程调用之前是否有一些事件被触发,我可以在其中设置该线程的调用上下文?还是 callcontext 默认保留对线程信息的引用?这对我有很大的帮助!谢谢。
    • @jnadro52:我想,就在进行远程调用之前,在客户端使用标识符设置调用上下文,然后在服务器端,在作为客户端远程调用的函数中,阅读首先调用上下文并构建一个集合,这样您就可以知道哪个客户端正在使用该线程。唯一的问题是集合必须是线程安全的......
    【解决方案2】:

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

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

    • 假设事务处理需要很长时间(几秒到几分钟),其他客户端必须等到第一个客户端完成。

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

    这是为(See MSDN) 构建的 TransactionScope 对象。如果不了解更多关于解决方案的拱门,我真的无法再提供帮助了。

    对不起...我不知道这是否有用。

    【讨论】:

    • 是的,这是一个单身人士,我应该在前面提到过。我使用 Monitor 设置了线程锁定机制。我在服务器端实现了这个。这会导致问题,因为线程 ID 在服务器端不断变化,即使同一个客户端线程正在调用远程处理对象。这是问题的症结所在……如何锁定服务器端进程,并确保另一个客户端线程不会访问创建事务对象的线程的事务对象?如果我有某种方法可以传递线程信息,那将是可能的。
    • @jnadro52:我喜欢 tommieb75 提出的调用上下文方法,它可以用来确定它是否是同一个调用者(有点像会话状态),并使用框架中的线程安全集合。我想这意味着您可能必须传递一个连接对象并在每个数据库调用中使用它以确保调用在事务中完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多