Модель потоков удаленного взаимодействия .NET
-
22-08-2019 - |
Вопрос
Я хотел бы знать, как потоки обрабатываются на стороне сервера с использованием объектов 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 - это ПЛОХОЕ решение.Но мне не позволено это менять, поэтому, пожалуйста, не предлагайте этого.
Решение
Я не эксперт в этом, но я бы действительно ожидать запись в MyInt
для надежного завершения до того, как клиентское событие попытается выполнить запись в MyString
если только у вас не происходит какое-то странное асинхронное поведение.
В конце концов, если назначение по какой-то причине завершается неудачей, единственный разумный способ справиться с этим - создать исключение перед продолжением, IMO.
Другие советы
Действительно, насколько я мог бы подумать об этом, установка двух свойств не происходит асинхронно, поэтому клиент ожидает завершения 1-го RPC, прежде чем он запустится с RPC 2.
В любом случае, если ваш MyRemotedClass не настроен как одноэлементный объект, активируемый сервером, также имейте в виду, что для каждого RPC, который вы выполняете на MyRemotedClass, на сервере будет создан новый экземпляр.Это означает, что удаленный объект не должен содержать никакого состояния.