Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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
.NET远程处理线程锁定机制_.net_Multithreading_Remoting_Thread Safety - Fatal编程技术网

.NET远程处理线程锁定机制

.NET远程处理线程锁定机制,.net,multithreading,remoting,thread-safety,.net,Multithreading,Remoting,Thread Safety,我有一个紧迫的问题,我希望你们都能帮助我。我会尽力解释清楚 我正在扩充一个使用.NET远程处理的系统,以允许从瘦客户机到执行上述调用的服务器的数据库调用。服务器本身安装了数据访问组件,因此它对数据库进行实际调用,并将数据行返回瘦客户机 我最近刚刚在这些模块中添加了事务。我想使这个线程安全,如果客户端线程A启动数据库事务,客户端线程B将无法访问客户端线程A的事务。同时不需要允许客户端线程B拥有自己的事务,只需要我不允许客户端线程B使用客户端线程A的事务 它们共享的远程处理对象只有一个引用,由于我将

我有一个紧迫的问题,我希望你们都能帮助我。我会尽力解释清楚

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

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

它们共享的远程处理对象只有一个引用,由于我将不深入讨论的底层架构,我无法更改这一点。所有事务对象都存储在此远程处理对象中的服务器上

除了在每次事务调用中传递客户端线程信息外,我认为没有什么好方法可以做到这一点,这在我紧迫的时间表中是不可行的-(也许,如果远程处理对象可以访问调用的客户端线程,那么我就不必在每次调用时都传递线程信息,这样做是可行的

如果有某种方式可以将客户端线程与远程处理进程线程关联起来,我认为这样做就可以了,但是我找不到关于这方面的文档


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

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

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

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

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

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

这就是TransactionScope对象构建的目的。如果不进一步了解解决方案的要点,我将无法再提供帮助


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

是的,这是一个单例,我应该在前面提到。我使用监视器有一个线程锁定机制。我在服务器端实现了这一点。这会导致问题,因为服务器端的线程ID不断变化,即使同一个客户端线程正在调用e远程处理对象。这是问题的关键……如何锁定服务器端进程,并确保另一个客户端线程不访问创建事务对象的线程的事务对象?如果我有某种方式传递线程信息,那么这是可能的。@jnadro52:我喜欢调用上下文方法propotommieb75使用sed作为确定是否是同一个调用方的方法(有点像会话状态),并使用框架中的线程安全集合。我想这意味着您可能必须传递一个连接对象,并在每次数据库调用中使用它,以确保调用在事务中完成。感谢您的建议。我不知道CallContext,这对我有很大帮助。我只是不知道如何确保线程信息将始终被传递。似乎我需要确保为每个调用线程设置线程上下文,这在我的时间线中可能不可行。是否有一些事件在远程处理调用之前触发,我可以在其中为该线程设置callcontext?还是callcontext保留引用默认情况下访问线程信息?这将对我有很大帮助!谢谢。@jnadro52:我想,在进行远程调用之前,在客户端使用标识符设置调用上下文,然后在服务器端,在作为客户端远程调用的函数中,首先读取调用上下文并构建一个集合,这样您就可以如何确定哪个客户端正在使用线程。唯一的问题是集合必须是线程安全的。。。。