none
Erro com Threads : Operação entre threads inválida: controle 'Form1' acessado de um thread que não é aquele no qual foi criado. RRS feed

  • Pergunta

  • Olá...

    Estou estudando csharp sockets, este erro apareceu ...

    vou deixar o código ai :

    Se algém puder ajudar eu agradeço :))...

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Diagnostics;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace Server
    {
        public partial class Form1 : Form
        {
            TcpListener server;
            TcpClient client;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void txtStart_Click(object sender, EventArgs e)
            {
                this.Hide();
                try
                {
                    server = new TcpListener(25565);
                    server.Start();
                    client = server.AcceptTcpClient();
                    Thread tReceber = new Thread(new ThreadStart(Receber));
                    tReceber.Start();
                    MessageBox.Show("servidor iniciado com sucesso ! :)", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                }
                catch (Exception erro)
                {
                    MessageBox.Show("Erro ao tentar iniciar... \n - Desative o firewall \n - Certifique-se que está conectado à internet", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
               
            }
    
            void Receber()
            {
                while(true)
                {
                    NetworkStream ns = client.GetStream();
                    byte[] buffer = new byte[1024];
                    ns.Read(buffer, 0, buffer.Length);
                    string msg = Encoding.ASCII.GetString(buffer);
                    ns.Flush();
                    if (msg == "Oi")
                    {
                        this.Show();
                        MessageBox.Show("Ele disse oi !");
                    }
                    else
                    {
                        this.Show();
                        MessageBox.Show(msg);
                    }
                }
            }
        }
    }
    


    Luan Freire

    quarta-feira, 9 de março de 2016 03:55

Respostas

  • Bom dia, ao utilizar Threads é comum ocorrer este comportamento, isso se devido ao Form ou um Controle qualquer estar em uso por outra Thread. Para resolver esse problema na maioria das vezes um Delegate resolve. Alterei o teu código e adicionei o método ReceberMensagem(string msg) e troquei as linhas da exibição da mensagem pela chamada do método. Segue o código fonte alterado.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Diagnostics;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace Server
    {
        public partial class Form1 : Form
        {
            TcpListener server;
            TcpClient client;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void txtStart_Click(object sender, EventArgs e)
            {
                this.Hide();
                try
                {
                    server = new TcpListener(25565);
                    server.Start();
                    client = server.AcceptTcpClient();
                    Thread tReceber = new Thread(new ThreadStart(Receber));
                    tReceber.Start();
                    MessageBox.Show("servidor iniciado com sucesso ! :)", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
                }
                catch (Exception erro)
                {
                    MessageBox.Show("Erro ao tentar iniciar... \n - Desative o firewall \n - Certifique-se que está conectado à internet", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
            }
    
            void Receber()
            {
                while (true)
                {
                    NetworkStream ns = client.GetStream();
                    byte[] buffer = new byte[1024];
                    ns.Read(buffer, 0, buffer.Length);
                    string msg = Encoding.ASCII.GetString(buffer);
                    ns.Flush();
    
                    ReceberMensagem(msg);
                    //if (msg == "Oi")
                    //{
                    //    this.Show();
                    //    MessageBox.Show("Ele disse oi !");
                    //}
                    //else
                    //{
                    //    this.Show();
                    //    MessageBox.Show(msg);
                    //}
                }
            }
    
            delegate void ReceberMensagemCallback(string msg);
            void ReceberMensagem(string msg)
            {
                if (InvokeRequired)
                {
                    ReceberMensagemCallback callback = ReceberMensagem;
                    Invoke(callback, msg);
                }
                else
                {
                    if (msg == "Oi")
                    {
                        this.Show();
                        MessageBox.Show("Ele disse oi !");
                    }
                    else
                    {
                        this.Show();
                        MessageBox.Show(msg);
                    }
                }
            }
        }
    }
    


    Gilson Joanelo - Desenvolvedor Web

    • Marcado como Resposta Marcos SJ quarta-feira, 9 de março de 2016 15:02
    quarta-feira, 9 de março de 2016 10:57