【问题标题】:.NET remoting threading model.NET 远程线程模型
【发布时间】:2009-02-08 08:44:04
【问题描述】:

我想知道如何使用 MarshalByRef 对象在服务器端处理线程。

鉴于我的远程 MarshalByRef 课程:

public class MyRemotedClass : MarshalByRef
{
  public int MyInt;
  public string MyString;
}

客户端代码(单线程):

MyRemotedClass m = GetSomehowMyRemotedClass(); 
m.MyInt = 5; // Write operation 1
m.MyString = "Hello World"; // Write operation 2

在服务器端,我们有两个写操作。我假设线程来自线程池。但是,由于该类是 MarshalByRef,因此两个操作都是单独的远程过程调用。他们会在单独的线程上运行吗?如果是,是否会在操作 1 完成之前执行操作 2?

PS:制作 MyRemotedClass MarshalByRef 是错误的决定。但我不能改变它,所以请不要这样提议。

【问题讨论】:

    标签: .net multithreading remoting marshalbyrefobject


    【解决方案1】:

    我不是这方面的专家,但我真的希望在客户端事件尝试写入 MyString 之前可靠地完成对 MyInt 的写入,除非您已经发生了一些时髦的异步行为。

    毕竟,如果分配由于某种原因失败,唯一明智的处理方法是在继续之前抛出异常,IMO。

    【讨论】:

      【解决方案2】:

      确实,就我的想法而言,设置 2 个属性并不是异步发生的,因此客户端会等到第 1 个 RPC 完成后才开始使用 RPC 2。

      无论如何,如果您的 MyRemotedClass 未配置为单例服务器激活对象,请记住,对于您在 MyRemotedClass 上执行的每个 RPC,将在服务器上创建一个新实例。这意味着远程对象不应包含任何状态。

      【讨论】:

      • 我不认为如果它是 MarshalByRefObject,它会创建一个新实例。 MBRO 的全部意义(据我所知)是只有一个引用被编组,并且对象本身“存在”在服务器上。
      • 借调 - 因此远程终身服务/租约。
      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2020-10-05
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多