我想知道如何使用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的决定。但是我不允许改变它,所以请不要提议。
答案 0 :(得分:2)
我不是这方面的专家,但我确实期望对MyInt
的写入在客户端事件尝试写入MyString
之前已经可靠地完成除非你有一些时髦的异步行为。
毕竟,如果作业由于某种原因失败,唯一明智的处理办法是在继续之前抛出异常,IMO。
答案 1 :(得分:2)
实际上,就我的想法而言,设置2个属性并不是异步发生的,因此客户端正在等待,直到第一个RPC完成才能从RPC 2开始。
无论如何,如果您的MyRemotedClass未配置为单独服务器激活的对象,请记住,对于您在MyRemotedClass上执行的每个RPC,将在服务器上创建一个新实例。这意味着远程对象不应包含任何状态。