Удвоение цикла при подписке на событие

244
20 октября 2017, 11:49

Добрый день! Помогите разобраться. Пишу Клиент - серверное приложение. Начал подключать юзеринтерфейс с помощью wpf.

Есть кнопка Connect, которая в зависимость от состояния подключения к серверной части имеет функционал отключения/подключения. Делаю это с помощью событий, отслеживая в классе client свойство connect.

После первого нажатия происходит подключение, после второго отключение. А вот на третьем и далее происходит удвоение. Т.е. цикл проверки состояния connect бежит по нескольку раз. Есть подозрение на удвоение подписки на событие. Но удаление, перед новым добавлением ничего не дает.

 public MainWindow()
    {
        InitializeComponent();

        client.ConnectionTrue += ChangeConnectionButtonTrue;
        client.ConnectionFalse += ChangeConnectionButtonFalse;
    }
private void ChangeConnectionButtonTrue()
    {
        ConnectionButton.Content = "Disconnect";
        ConnectionButton.Click += ConnectionButton_Click_Disconnect;
    }
    private void ChangeConnectionButtonFalse()
    {
        ConnectionButton.Content = "Connect";
        ConnectionButton.Click += ConnectionButton_Click;
    }
    private void ConnectionButton_Click(object sender, RoutedEventArgs e)
    {
        client.Connect();
        if (client.Connected)
        {
            AutorizatTextBlock.Text = "Успешное подключение";
        }
        else AutorizatTextBlock.Text = "Сервер не доступен";
    }
    private void ConnectionButton_Click_Disconnect(object sender, RoutedEventArgs e)
    {
        client.Disconnect();
        if (!client.Connected)
        {
            AutorizatTextBlock.Text = "Отключен";
        }
        else AutorizatTextBlock.Text = "Сервер не доступен";
    }
}

class Client 
{
    const int port = 8888;
    const string address = "127.0.0.1";
    bool connected;
    public NetworkStream stream;
    TcpClient client;
    public  bool Connected
    {
        get { return connected; }
        set {
            if (connected != value)
            {
                connected = value;
                if (Connected)
                {
                    ConnectionTrue();
                }
                else
                {
                    ConnectionFalse();
                }
            }
        }
    }
    public void Connect ()
        {
        try
        {
            if (!Connected)
            {
                client = new TcpClient(address, port);
                stream = client.GetStream();
                Connected = true;
            }
        }
        catch (Exception)
        {
            Connected = false;
        }
    }
    public void Disconnect()
    {
        if (Connected)
        {
                stream.Close();//отключение потока                  
                client.Close();//отключение клиента       
                Connected = false;
        }
    }
public delegate void ConnectionTrueHandler();
    public event ConnectionTrueHandler ConnectionTrue;
    public delegate void ConnectionFalseHandler();
    public event ConnectionFalseHandler ConnectionFalse;

}

Answer 1
private void ChangeConnectionButtonTrue()
{
    ConnectionButton.Content = "Disconnect";
    ConnectionButton.Click -= ConnectionButton_Click;
    ConnectionButton.Click += ConnectionButton_Click_Disconnect;
}
private void ChangeConnectionButtonFalse()
{
    ConnectionButton.Content = "Connect";
    ConnectionButton.Click -= ConnectionButton_Click_Disconnect;
    ConnectionButton.Click += ConnectionButton_Click;
}
READ ALSO
Создание модели ADO NET из файла базы данных SDB

Создание модели ADO NET из файла базы данных SDB

Есть файл БД с расширением SDBКак его подключить в Visual Studio и создать из не модель, для последующей полноценной работы через Linq

240
Устранение замыленности формы

Устранение замыленности формы

Этот вопрос исходит из этого вопросаМне не нравится что настройки, которые устраняют "замыленность" формы содержаться в app

215