Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fabricioss

com erro Cross-thread operation not valid

Recommended Posts

Pessoal,Alguém poderia me ajudar com o erro abaixo? Estou colando o código do meu programa também. Dei uma pesquisada e vi que talvez eu possa solucionar isto usando a classe BackgroundWorker, mas não faço nem idéia de como fazer...Sugestões?ERRO: System.InvalidOperationException: Cross-thread operation not valid: 'inputTextBox' accessed from a thread other than the thread it was created on.++++++++++++++++++++++++++++++++++++++++++++++++++using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.IO;using System.Threading;namespace ServerApp{ public partial class ServerAppForm : Form { private Socket connection; private NetworkStream socketStream; private BinaryWriter writer; private BinaryReader reader; private Thread readThread; public ServerAppForm() { InitializeComponent(); // create a new thread from the server readThread = new Thread(new ThreadStart(RunServer) ); readThread.Start(); } public void RunServer() { TcpListener listener; // wait for a client connection try { // Step 1: create TcpListener int port = 5000; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); listener = new TcpListener(localAddr, port); // Step 2: TcpListener waits for connection request listener.Start(); // Step 3: establish connection upon client request while (true) { inputTextBox.Enabled = true; sendButton.Enabled = true; // accept an incoming conection connection = listener.AcceptSocket(); // create NetworkStream object associated with socket socketStream = new NetworkStream(connection); // create objects for transferring data across stream writer = new BinaryWriter(socketStream); reader = new BinaryReader(socketStream); string theReply = ""; // inform client that connection was successfull writer.Write("SERVER>>> Connection successful"); displayTextBox.Text += reader.ReadString(); // Step 4: read String data sent from client do { try { // read the string sent to the server theReply = reader.ReadString(); displayTextBox.Text += "\r\n" + theReply; } // handle exception if error erading data catch ( Exception ) { break; } } while (connection.Connected ); displayTextBox.Text += "\r\nUser terminated connection.\r\n"; // Step 5: close connection writer.Close(); reader.Close(); socketStream.Close(); connection.Close(); } } // end try catch (Exception error) { MessageBox.Show(error.ToString()); } } private void ServerAppForm_FormClosing(object sender, FormClosingEventArgs e) { System.Environment.Exit(System.Environment.ExitCode); } private void sendButton_Click(object sender, EventArgs e) { writer.Write(inputTextBox.Text); displayTextBox.Text += "\r\n" + inputTextBox.Text; inputTextBox.Clear(); } }}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é possível mexer com objetos criados por outro thread, a não ser através de um delegate. No caso você precisaria chamar o método Invoke da caixa de texto para definir o texto da mesma.Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é possível mexer com objetos criados por outro thread, a não ser através de um delegate. No caso você precisaria chamar o método Invoke da caixa de texto para definir o texto da mesma.Abraços,Graymalkin

Graymalkin, obrigado por responder! Você poderia me dar um exemplo? Eu nunca usei delegates ou o método invoke. Onde e como eu poderia chamar esse método no meu código, se você por favor me mostrar como eu faço para mudar o texto da caixa de texto, eu consigo fazer isso para os outros controles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se vai ajudar muito, mas eu só fiz isso em VB.NET. No caso, eu declarei uma delegação assim:

 

Public Delegate Sub Delegação(ByVal texto As String)

E depois criei um método para alterar o texto:

 

Public Sub DefinirTexto(ByVal texto As String)		If TextBox1.InvokeRequired Then			Dim d As New Delegação(AddressOf DefinirTexto)			TextBox1.Invoke(d, texto)		Else			TextBox1.Text = texto		End If	End Sub

Daí, basta chamar o método DefinirTexto() ao invés de atribuir o texto diretamente para a propriedade Text da caixa de texto. Estou meio sem tempo agora, mas posso ver se amanhã faço um exemplo em C#.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.