2009-02-08 66 views
2

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

鉴于我远程的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 

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

PS:制作MyRemotedClass MarshalByRef是个坏决定。但我不能改变这一点,所以请不要提出这个建议。

回答

2

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

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

2

事实上,据我会想想,设置2个属性是不会发生异步,所以客户端等待,直到前,将与RPC开始第一次RPC完成2

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

+0

我不*认为*它会创建一个新的实例,如果它是MarshalByRefObject。根据我的理解,MBRO的重点在于只有一个引用被编组,并且该对象本身“生活在”服务器上。 – 2009-02-08 09:36:58