Текст в TextBlock не меняется ⇐ C#
-
Anonymous
Текст в TextBlock не меняется
У меня есть две программы: клиентская (с использованием WPF) и серверная (консольное приложение). Сервер может работать с двумя потоками. Клиент отправляет на сервер «1» или «2», затем сервер отправляет ему «3» или «4». Клиент успешно получает ответ, но показывает «1» или «2» в TextBlock (устарело) из-за потоков. Переменная "result" всегда равна "\0", а "PropertyChanged" в Client всегда имеет значение null.
Сервер:
с использованием System.Text; использование System.Net.Sockets; использование System.Net; Сервер пространства имен { внутренний класс ServerHandler { //частная константная строка _IP = "127.0.0.1"; частная константа int _PORT = 8888; частная константа int _BUFFER_SIZE = 1; защищенный внутренний TcpListener _Listener {get; набор; } защищенная внутренняя асинхронная задача ListenAsync() { пытаться { //IP-адрес localAddr = IPAddress.Parse(_IP); _Listener = новый TcpListener(IPAddress.Any, _PORT); _Слушатель.Старт(); пока (правда) { Console.WriteLine("ОК"); TcpClient tcpClient = ждут _Listener.AcceptTcpClientAsync(); ClientObject clientObject = новый ClientObject (tcpClient); } //ClientHandler(_Listener.AcceptTcpClient()); } поймать (SocketException ex) { выдать новое исключение (ex.Message); } } ~СерверХандлер() { если (_Listener != ноль) _Слушатель.Стоп(); } static void Main(string[] args) { пытаться { Обработчик ServerHandler = new(); обработчик.ListenAsync(); Консоль.ReadKey(); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } внутренний класс ClientObject { защищенный внутренний TcpClient _Client {get; набор; } защищенный внутренний NetworkStream _Stream {get; набор; } общедоступный ClientObject (клиент TcpClient) { _Клиент = клиент; буфер байт[] = новый байт[_BUFFER_SIZE]; _Stream = _Client.GetStream(); _Stream.BeginRead(буфер, 0, буфер.Длина, EndRead, буфер); //_Stream.ReadAsync(buffer, 0, buffer.Length); //_Stream.Write(buffer, 0, buffer.Length); строковый результат = Encoding.UTF8.GetString(буфер); //_Stream.WriteAsync(буфер); ОтправитьСообщение (результат); } public void EndRead (результат IAsyncResult) { буфер байт[] = (байт[])result.AsyncState; вар нс = _Client.GetStream(); вар bytesAvalable = ns.EndRead(результат); } асинхронная сила SendMessage (строка ул) { пытаться { //ждем Task.Run(() => //{ интервал значений; bool isParsed = Int32.TryParse(str, out val); если (!isParsed) возвращаться; если (значение != 1 && значение != 2) возвращаться; вал = вал == 1 ? 3:4; стр = val.ToString(); буфер byte[] = Encoding.UTF8.GetBytes(str); _Stream.WriteAsync(буфер); _Stream.Flush(); //}); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } } Клиент.xaml:
Client.xaml.cs:
с использованием системы; использование System.Text; использование System.Windows; использование System.Windows.Controls; использование System.Net.Sockets; использование System.ComponentModel; использование System.Runtime.CompilerServices; Клиент пространства имен { /// /// Логика взаимодействия для MainWindow.xaml /// общедоступный частичный класс MainWindow: Window, INotifyPropertyChanged { частная константная строка _IP = "127.0.0.1"; частная константа int _PORT = 8888; частная константа int _BUFFER_SIZE = 1; частный TcpClient _Client; частная строка _message; общедоступное главное окно() { ИнициализироватьКомпонент(); } частный void TextBox_TextChanged (отправитель объекта, TextChangedEventArgs e) { пытаться { TextBox textBox = (TextBox) отправитель; textBox.MaxLength = 1; интервал numVal; bool isParsed = int.TryParse(textBox.Text, out numVal); если (isParsed) { если (numVal != 1 && numVal != 2) TextBlock_1.Text = "Значение должно быть 1 или 2!"; еще TextBlock_1.Text = String.Empty; } еще { TextBlock_1.Text = "Значение должно быть 1 или 2!"; } } поймать (Исключение ex) { TextBlock_1.Text = ex.Message; } } частный void Button_Click (отправитель объекта, RoutedEventArgs e) { _Client = новый TcpClient(); пытаться { интервал numVal; bool isParsed = int.TryParse(TextBox_1.Text, out numVal); если (!isParsed) возвращаться; если (numVal != 1 && numVal != 2) возвращаться; _Client.ConnectAsync(_IP, _PORT); // Ошибка вар Stream = _Client.GetStream(); если (Поток != ноль && TextBox_1.Text != String.Empty) { буфер байт[] = новый байт[_BUFFER_SIZE]; буфер = Encoding.UTF8.GetBytes(TextBox_1.Text); SendMessage(поток, буфер); байт[]ufferResult = новый байт[_BUFFER_SIZE]; Stream.BeginRead(bufferResult, 0, bufferResult.Length, EndRead, bufferResult); строковый результат = Encoding.UTF8.GetString(bufferResult); //Привязка привязки = BindingOperations.GetBinding(TextBlock_1, TextBlock.TextProperty); Сообщение = результат; } } поймать (SocketException ex) { TextBlock_1.Text = ex.Message; } } public void EndRead (результат IAsyncResult) { буфер байт[] = (байт[])result.AsyncState; вар нс = _Client.GetStream(); вар bytesAvalable = ns.EndRead(результат); } общественная недействительность BeginRead (клиент TcpClient) { пытаться { если (Клиент == ноль) возвращаться; буфер байт[] = новый байт[_BUFFER_SIZE]; если (Клиент.Подключен) { NetworkStream Stream = Client.GetStream(); Обратный вызов AsyncCallback = null; обратный вызов = ар => { Stream.BeginRead(буфер, 0, буфер.Длина, обратный вызов, буфер); }; } еще { Client.Connect(_IP, _PORT); } } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } async void SendMessage (поток NetworkStream, буфер byte[]) { пытаться { Stream.Write(буфер, 0, буфер.Длина); строковый результат = Encoding.UTF8.GetString(буфер); Стрим.Флеш(); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } #region ViewModelProperty: Сообщение общедоступная строка Сообщение { получать { вернуть _сообщение; } набор { //_сообщение = значение; _message = "123"; OnPropertyChanged(_message); } } #конечныйрегион #region Блок INotifiedProperty //публичное событие EventHandler SomeEventHappened = делегат {}; публичное событие PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string propertyName = "") { пытаться { Обработчик PropertyChangedEventHandler = PropertyChanged; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //обработчик?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } catch (исключение ex) { } } #конечныйрегион } } Изначально я пытался использовать «TextBlock_1.Text = result», но это не сработало, значения по-прежнему были «1» и «2». Затем я прочитал, что мне нужно использовать событие PropertyChangedEventHandler. Но это не помогло.
У меня есть две программы: клиентская (с использованием WPF) и серверная (консольное приложение). Сервер может работать с двумя потоками. Клиент отправляет на сервер «1» или «2», затем сервер отправляет ему «3» или «4». Клиент успешно получает ответ, но показывает «1» или «2» в TextBlock (устарело) из-за потоков. Переменная "result" всегда равна "\0", а "PropertyChanged" в Client всегда имеет значение null.
Сервер:
с использованием System.Text; использование System.Net.Sockets; использование System.Net; Сервер пространства имен { внутренний класс ServerHandler { //частная константная строка _IP = "127.0.0.1"; частная константа int _PORT = 8888; частная константа int _BUFFER_SIZE = 1; защищенный внутренний TcpListener _Listener {get; набор; } защищенная внутренняя асинхронная задача ListenAsync() { пытаться { //IP-адрес localAddr = IPAddress.Parse(_IP); _Listener = новый TcpListener(IPAddress.Any, _PORT); _Слушатель.Старт(); пока (правда) { Console.WriteLine("ОК"); TcpClient tcpClient = ждут _Listener.AcceptTcpClientAsync(); ClientObject clientObject = новый ClientObject (tcpClient); } //ClientHandler(_Listener.AcceptTcpClient()); } поймать (SocketException ex) { выдать новое исключение (ex.Message); } } ~СерверХандлер() { если (_Listener != ноль) _Слушатель.Стоп(); } static void Main(string[] args) { пытаться { Обработчик ServerHandler = new(); обработчик.ListenAsync(); Консоль.ReadKey(); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } внутренний класс ClientObject { защищенный внутренний TcpClient _Client {get; набор; } защищенный внутренний NetworkStream _Stream {get; набор; } общедоступный ClientObject (клиент TcpClient) { _Клиент = клиент; буфер байт[] = новый байт[_BUFFER_SIZE]; _Stream = _Client.GetStream(); _Stream.BeginRead(буфер, 0, буфер.Длина, EndRead, буфер); //_Stream.ReadAsync(buffer, 0, buffer.Length); //_Stream.Write(buffer, 0, buffer.Length); строковый результат = Encoding.UTF8.GetString(буфер); //_Stream.WriteAsync(буфер); ОтправитьСообщение (результат); } public void EndRead (результат IAsyncResult) { буфер байт[] = (байт[])result.AsyncState; вар нс = _Client.GetStream(); вар bytesAvalable = ns.EndRead(результат); } асинхронная сила SendMessage (строка ул) { пытаться { //ждем Task.Run(() => //{ интервал значений; bool isParsed = Int32.TryParse(str, out val); если (!isParsed) возвращаться; если (значение != 1 && значение != 2) возвращаться; вал = вал == 1 ? 3:4; стр = val.ToString(); буфер byte[] = Encoding.UTF8.GetBytes(str); _Stream.WriteAsync(буфер); _Stream.Flush(); //}); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } } Клиент.xaml:
Client.xaml.cs:
с использованием системы; использование System.Text; использование System.Windows; использование System.Windows.Controls; использование System.Net.Sockets; использование System.ComponentModel; использование System.Runtime.CompilerServices; Клиент пространства имен { /// /// Логика взаимодействия для MainWindow.xaml /// общедоступный частичный класс MainWindow: Window, INotifyPropertyChanged { частная константная строка _IP = "127.0.0.1"; частная константа int _PORT = 8888; частная константа int _BUFFER_SIZE = 1; частный TcpClient _Client; частная строка _message; общедоступное главное окно() { ИнициализироватьКомпонент(); } частный void TextBox_TextChanged (отправитель объекта, TextChangedEventArgs e) { пытаться { TextBox textBox = (TextBox) отправитель; textBox.MaxLength = 1; интервал numVal; bool isParsed = int.TryParse(textBox.Text, out numVal); если (isParsed) { если (numVal != 1 && numVal != 2) TextBlock_1.Text = "Значение должно быть 1 или 2!"; еще TextBlock_1.Text = String.Empty; } еще { TextBlock_1.Text = "Значение должно быть 1 или 2!"; } } поймать (Исключение ex) { TextBlock_1.Text = ex.Message; } } частный void Button_Click (отправитель объекта, RoutedEventArgs e) { _Client = новый TcpClient(); пытаться { интервал numVal; bool isParsed = int.TryParse(TextBox_1.Text, out numVal); если (!isParsed) возвращаться; если (numVal != 1 && numVal != 2) возвращаться; _Client.ConnectAsync(_IP, _PORT); // Ошибка вар Stream = _Client.GetStream(); если (Поток != ноль && TextBox_1.Text != String.Empty) { буфер байт[] = новый байт[_BUFFER_SIZE]; буфер = Encoding.UTF8.GetBytes(TextBox_1.Text); SendMessage(поток, буфер); байт[]ufferResult = новый байт[_BUFFER_SIZE]; Stream.BeginRead(bufferResult, 0, bufferResult.Length, EndRead, bufferResult); строковый результат = Encoding.UTF8.GetString(bufferResult); //Привязка привязки = BindingOperations.GetBinding(TextBlock_1, TextBlock.TextProperty); Сообщение = результат; } } поймать (SocketException ex) { TextBlock_1.Text = ex.Message; } } public void EndRead (результат IAsyncResult) { буфер байт[] = (байт[])result.AsyncState; вар нс = _Client.GetStream(); вар bytesAvalable = ns.EndRead(результат); } общественная недействительность BeginRead (клиент TcpClient) { пытаться { если (Клиент == ноль) возвращаться; буфер байт[] = новый байт[_BUFFER_SIZE]; если (Клиент.Подключен) { NetworkStream Stream = Client.GetStream(); Обратный вызов AsyncCallback = null; обратный вызов = ар => { Stream.BeginRead(буфер, 0, буфер.Длина, обратный вызов, буфер); }; } еще { Client.Connect(_IP, _PORT); } } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } async void SendMessage (поток NetworkStream, буфер byte[]) { пытаться { Stream.Write(буфер, 0, буфер.Длина); строковый результат = Encoding.UTF8.GetString(буфер); Стрим.Флеш(); } поймать (Исключение ex) { выдать новое исключение (ex.Message); } } #region ViewModelProperty: Сообщение общедоступная строка Сообщение { получать { вернуть _сообщение; } набор { //_сообщение = значение; _message = "123"; OnPropertyChanged(_message); } } #конечныйрегион #region Блок INotifiedProperty //публичное событие EventHandler SomeEventHappened = делегат {}; публичное событие PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string propertyName = "") { пытаться { Обработчик PropertyChangedEventHandler = PropertyChanged; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //обработчик?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } catch (исключение ex) { } } #конечныйрегион } } Изначально я пытался использовать «TextBlock_1.Text = result», но это не сработало, значения по-прежнему были «1» и «2». Затем я прочитал, что мне нужно использовать событие PropertyChangedEventHandler. Но это не помогло.
Мобильная версия