una thread the than subproceso que para other llamó interfaz from example diferente created control aplicación aplanó accessed c# .net multithreading textbox

c# - thread - Escribir en un cuadro de texto usando dos hilos



ui thread c# (6)

Tengo un problema sin resolver con los hilos. Es la primera vez que lo hago. Sé cómo usar un hilo para escribir en un cuadro de texto, pero no tengo idea de cómo usar dos de ellos para hacer el trabajo. Alguien tiene una pista de qué tengo que hacer para poder usar dos hilos para escribir en el mismo cuadro de texto, pero no al mismo tiempo. Gracias.


El enfoque más seguro es que solo 1 subproceso sea capaz de trabajar en el cuadro de texto (o cualquier objeto GUI), tener otros subprocesos que necesiten realizar una acción en el cuadro de texto para comunicar sus necesidades al subproceso que controla el cuadro de texto.

así que su pregunta es cómo comunicarse entre hilos, esto será específico para el lenguaje / sistema operativo, por lo que debe proporcionar más información.


Este artículo de MSDN explica cómo realizar llamadas seguras para hilos a los controles de formulario de Windows.


Otra opción es utilizar un método Thread Callback. Este es un método que existe en el hilo principal, pero cuando creas un hilo nuevo pasas un control / referencia a este método. Esto permite que el segundo hilo invoque el método en el hilo principal y la funcionalidad para actualizar / verificar el cuadro de texto se ubicaría allí.

Fíjate en pasar delegados entre hilos.


Solo puede acceder a los componentes de la GUI desde el hilo principal. Para escribir en un cuadro de texto de otro hilo, debe usar BeginInvoke () .


Aquí hay un ejemplo que usa dos hilos para escribir números aleatorios en un cuadro de texto de varias líneas. Como notaron Brandon y Jon B, debe usar Invoke () para serializar las llamadas al hilo de la GUI.

public partial class Form1 : Form { public Form1() { InitializeComponent(); } Random m_random = new Random((int)DateTime.Now.Ticks); ManualResetEvent m_stopThreadsEvent = new ManualResetEvent(false); private void buttonStart_Click(object sender, EventArgs e) { Thread t1 = new Thread(new ThreadStart(ThreadOne)); Thread t2 = new Thread(new ThreadStart(ThreadTwo)); t1.Start(); t2.Start(); } private void ThreadOne() { for(;;) { int n = m_random.Next(1000); AppendText(String.Format("One: {0}/r/n", n)); if(m_stopThreadsEvent.WaitOne(n)) { break; } } } private void ThreadTwo() { for(;;) { int n = m_random.Next(1000); AppendText(String.Format("Two: {0}/r/n", n)); if(m_stopThreadsEvent.WaitOne(n)) { break; } } } delegate void AppendTextDelegate(string text); private void AppendText(string text) { if(textBoxLog.InvokeRequired) { textBoxLog.Invoke(new AppendTextDelegate(this.AppendText), new object[] { text }); } else { textBoxLog.Text = textBoxLog.Text += text; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { m_stopThreadsEvent.Set(); } }


Una opción que podría hacer es enviar mensajes a un objeto Queue y usar un temporizador en el formulario de Windows para leer mensajes de esta cola y escribir en el cuadro de texto.

Con el fin de hacer que todo sea agradable y se realicen subprocesos, puede bloquear el objeto Queue al leer y escribir en él.

Por ejemplo:

private Queue<string> messages = new Queue<string>(); /// <summary> /// Add Message To The Queue /// </summary> /// <param name="text"></param> public void NewMessage(string text) { lock (messages) { messages.Enqueue(text); } } private void tmr_Tick(object sender, EventArgs e) { if (messages.Count == 0) return; lock (messages) { this.textBox.Text += Environment.NewLine + messages; } }