ОТРЕДАКТИРОВАНО: получатель не получает сообщение после регистрации в WeakReferenceMessenger.C#

Место общения программистов C#
Ответить
Anonymous
 ОТРЕДАКТИРОВАНО: получатель не получает сообщение после регистрации в WeakReferenceMessenger.

Сообщение Anonymous »

Я использую MVVM из набора инструментов сообщества WeakReferenceMessenger для отправки сообщений и данных между моими моделями представления. У меня модель клиент-сервер, и у меня возникли проблемы на моем клиенте.
У меня есть один поток прослушивания, который прослушивает входящие сообщения с сервера. Когда сеанс запущен, сообщение принимается. StartSessionMessage (полученный из RequestMessage) отправляется WeakReferenceMessenger.Default.Send(new StartSessionMessage(MapSession(sessionData))).
В настоящее время есть 4 получающих модели представления, которые подписались на это сообщение одинаковым образом

Код: Выделить всё

WeakReferenceMessenger.Default.Register(this, (r, m) => { InitSession(m.Session); });
Сообщение:

Код: Выделить всё

public class StartSessionMessage : RequestMessage
{
public Session Session { get; set; }

public StartSessionMessage(Session session)
{
Session = session;
}
}
Отправитель:

Код: Выделить всё

        public async Task StartServerAsync()
{
string clientIP = NetworkManager.GetLocalIpv4();
int clientPort = Int32.Parse(ConfigurationManager.AppSettings.Get("LocalPort"));
IPAddress ipAddress = IPAddress.Parse(clientIP);
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, clientPort);

using Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

listener.Bind(localEndPoint);
listener.Listen(100);
var buffer = new byte[128_000_000];

try
{
while (true)
{
// Receive message
var handler = listener.Accept();
int received = handler.Receive(buffer, SocketFlags.None);
var receivedMessage = Encoding.UTF8.GetString(buffer, 0, received);

if (receivedMessage.Contains(MessageTags.SESSION))
{
receivedMessage = receivedMessage.Replace(MessageTags.SESSION, "");
var sessionData = JsonConvert.DeserializeObject(receivedMessage);
WeakReferenceMessenger.Default.Send(new StartSessionMessage(MapSession(sessionData)));
}
}
}
catch (Exception ex)
{
listener.Close();
Task.Run(() => { _ = StartServerAsync(); });
}
}
Получатель 1:

Код: Выделить всё

public MainWindowViewModel(Window window)
{
_window = window;
WeakReferenceMessenger.Default.Register(this, (r, m) => { InitSession(m.Session); });

var baseGameView = new BaseGameView();
baseGameView.Show();

var gameScoreView = new GameScoresView();
gameScoreView.Show();
WindowManipulator.SetWindowToBigScreen(gameScoreView, false, WindowState.Minimized, WindowStyle.None);

var editPlayersView = new EditPlayersView();
editPlayersView.Show();

var ImageScreenView = new ImageScreenView();
ImageScreenView.Show();
WindowManipulator.SetWindowToBigScreen(ImageScreenView, false, WindowState.Maximized, WindowStyle.None);
}

private void InitSession(Session messageValue)
{
WindowManipulator.SetWindowToSmallScreen(_window, false, WindowState.Minimized, WindowStyle.None);
}
Получатель 2:

Код: Выделить всё

public BaseGameViewModel(Window window)
{
_window = window;
Session = new Session();

WeakReferenceMessenger.Default.Register(this, (r, m) => { InitSession(m.Session); });
}

private void InitSession(Session session)
{
Session = session;
Session.WarmUpDoneEvent += ChangeTimeText;
Session.SessionDoneEvent += SessionDone;
Session.SessionStoppedEvent += StopSession;
WindowManipulator.SetWindowToSmallScreen(_window, false, WindowState.Minimized, WindowStyle.None);
}
Получатель 3:

Код: Выделить всё

public GameScoresViewModel(Window window)
{
_window = window;

WeakReferenceMessenger.Default.Register(this, (r, m) => { InitSession(m.Session);  });
}

private void InitSession(Session session)
{
TeamName = session.TeamName;
WindowManipulator.SetWindowToBigScreen(_window, true, WindowState.Maximized, WindowStyle.None);
}
Приемник 4:

Код: Выделить всё

public EditPlayersViewModel(Window window)
{
_window = window;
_isListReset = true;
_resetSelectedIndex = false;
_firstTime = true;
_players = new ObservableCollection
();
WeakReferenceMessenger.Default.Register(this, (r, m) => { InitSession(m.Session); });
}

private void InitSession(Session session)
{
Players = new ObservableCollection(session.Players.Select(x => new Player(x)));
_isListReset = true;
_firstTime = true;
WindowManipulator.SetWindowToSmallScreen(_window, true, WindowState.Maximized, WindowStyle.None);
}
По какой-то причине у меня есть одна ViewModel, Receiver 4, которая не получает сообщение, EditPlayers, и именно она всегда не выполняет InitSession
код > код. Представления всегда загружаются в одном и том же порядке, это полностью отдельные окна, все из которых начинаются с кода программной части MainWindow.
Поэтому мне интересно, что я делаю неправильно, есть ли максимальный размер количество регистров для 1 сообщения?
  • Пытал искать в Интернете максимумы или другие случаи с той же проблемой, но ничего не нашел.
    < li>Пытался изменить сообщение с RequestMessage на ValueChangedMessage, тоже ничего не изменилось. Подумал, что, возможно, тип сообщения имеет ограничение на количество получателей.
  • Дважды проверил код и правильное ли сообщение использовалось в регистрах.


Подробнее здесь: https://stackoverflow.com/questions/789 ... erencemess
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»