267 messaggi dal 29 settembre 2009
premetto che forse è la prima volta che provo a fare una winform ma cmq ho provato a scrivere questo semplice form con un'unica richtextbox e il codice per lanciare una comunicazione TCP_IP.
Sulla comunicazione TCP_IP non ci sono problemi ma quando provo a loggare i dati che ricevo sulla rich ottentgo questo errore


Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'LogRichText' da un thread diverso da quello da cui è stata eseguita la creazione.


Come posso risolvere questa cosa?

vi sposto il codice della win form

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.Sockets;
using System.Threading;
using System.Net;


namespace TCP_SIMULATE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static string _addText = "";

        
        private void Form1_Load(object sender, EventArgs e)
        {
            Server tcpServer = new Server(LogRichText);
        }


        class Server
        {
            private TcpListener tcpListener;
            private Thread listenThread;
            object _richText;

            public Server(object richText)
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 5000);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
                _richText = richText;
            }

            private void ListenForClients()
            {
                this.tcpListener.Start();

                while (true)
                {
                    //blocks until a client has connected to the server
                    TcpClient client = this.tcpListener.AcceptTcpClient();

                    //create a thread to handle communication 
                    //with connected client
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client);
                }
            }

            private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                //Console.WriteLine(encoder.GetString(message, 0, bytesRead));
                ((RichTextBox)_richText).Text += encoder.GetString(message, 0, bytesRead);
                tcpClient.Client.Send(message);
            }


            tcpClient.Close();
        }
        }
    }
}

Eccoti
http://msdn.microsoft.com/en-us/library/ms171728.aspx
In sostanza: il codice che lavora sulla UI deve lavorare sempre sullo stesso thread principale, quindi occhio a non eseguire troppa roba per mantenere l'interfaccia responsiva

Ciao

Il mio blog
Homepage
267 messaggi dal 29 settembre 2009
grazie Ricciolo con due righe hai risolto il problema :D

posto il codice che ho ottenuto dall'esempio

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.Sockets;
using System.Threading;
using System.Net;


namespace TCP_SIMULATE
{
    public partial class Form1 : Form
    {
        private TcpListener tcpListener;
        private Thread listenThread;
        delegate void SetTextCallback(string text);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tcpListener = new TcpListener(IPAddress.Any, 5000);
            listenThread = new Thread(new ThreadStart(ListenForClients));
            listenThread.Start();
        }

        private void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {
                TcpClient client = this.tcpListener.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            byte[] message = new byte[4471];
            int bytesRead;
            Random rnd = new Random();

            while (true){
                bytesRead = 0;
                
                try{
                    bytesRead = clientStream.Read(message, 0, 4471);
                }
                catch { break; };
                
                if (bytesRead == 0)break;

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                this.SetText(String.Format("READ >> {0} BYTES", bytesRead));
                //encoder.GetString(message, 0, bytesRead);
                byte[] SendMessage = new byte[4471];

                rnd.NextBytes(SendMessage);
                tcpClient.Client.Send(SendMessage);
            }



            tcpClient.Close();
        }

        public void SetText(string text)
        {
            if (this.LogRichText.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.LogRichText.AppendText(text);
                this.LogRichText.AppendText(Environment.NewLine);
            }
        }
    }
}

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.