.NET модель удаленного взаимодействия - PullRequest
2 голосов
/ 08 февраля 2009

Я хотел бы знать, как обрабатываются потоки на стороне сервера с использованием объектов 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 - ПЛОХОЕ решение. Но мне не разрешено это менять, поэтому, пожалуйста, не предлагайте это.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2009

Действительно, насколько я мог подумать, установка двух свойств не происходит асинхронно, поэтому клиент ждет, пока 1-й RPC не завершится, прежде чем он запустится с RPC 2.

В любом случае, если ваш MyRemotedClass не настроен как объект, активируемый одиночным сервером, также имейте в виду, что для каждого RPC, который вы делаете в MyRemotedClass, на сервере будет создан новый экземпляр. Это означает, что удаленный объект не должен содержать никакого состояния.

2 голосов
/ 08 февраля 2009

Я не эксперт в этом, но я действительно ожидаю , что запись в MyInt будет надежно завершена до того, как клиентское событие попытается записать в MyString, если вы не получили происходит какое-то странное асинхронное поведение.

В конце концов, если назначение по какой-то причине не удается, единственный разумный способ обработки, который заключается в создании исключения перед продолжением, IMO.

...