.NET远程处理线程模型

时间:2009-02-08 08:44:05

标签: .net multithreading remoting marshalbyrefobject

我想知道如何使用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

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

PS:制作MyRemotedClass MarshalByRef是BAD的决定。但是我不允许改变它,所以请不要提议。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

实际上,就我的想法而言,设置2个属性并不是异步发生的,因此客户端正在等待,直到第一个RPC完成才能从RPC 2开始。

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