Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top