Preguntas sobre programación de red C# y subprocesos múltiples, por favor denme algún consejo
1. En este caso, el subproceso múltiple, por supuesto, debe colocar los pasos que consumen más tiempo y las partes del bucle en subprocesos.
2. El código de otros subprocesos no puede operar directamente los controles en el subproceso de la interfaz de usuario. Requiere el uso de delegación.
No tengo muy claras tus necesidades específicas. Pero déjenme asumir un ejemplo aquí:
Por ejemplo, tengo un programa de compra de boletos que debe ir al servidor para solicitar la cantidad restante de boletos cada 2 segundos. mostrado en la interfaz.
También hay operaciones como "venta de entradas" y "reembolso de entradas" en la interfaz. La interfaz es como se muestra en la figura:
Entonces el código se puede escribir así: usando?System;
usando?System.Collections.Generic;
usando?System.ComponentModel;
usando?System.Data;
usando?System.Drawing;
usando?System.Text;
usando?System.Windows .Forms;
usando?System.Threading;
espacio de nombres?WindowsFormsApplication1
{
público ?partial?class?Form1?: ?Form
{
//BackgroundWorker es una clase de hilo bien encapsulada. Viene con .net.
private?BackgroundWorker?bg?=?new?BackgroundWorker();
//Delegate, utilizado para cambiar la visualización de la interfaz
private?delegate?void ? delegadoSetCounter(int?count);
public?Form1()
{
InitializeComponent();
//Establecer BackgroundWorker Cosas que hacer
bg.DoWork? =?new?DoWorkEventHandler(bg_DoWork);
//Configurar BackgroundWorker para admitir subprocesos de interrupción
bg.WorkerSupportsCancellation? ?true;
}
//La parte principal de lo que tiene que hacer el hilo
private?void?bg_DoWork(object?sender,?DoWorkEventArgs? e )
{
//Aquí, se supone que el hilo se repite infinitamente
while?(true)
{
//Salir si el hilo se cancela
if?(bg.CancellationPending)
return;
//Utiliza números aleatorios aquí para obtener y simular Obtener datos de la base de datos
Random?r?=?new?Random(DateTime.Now.Second);
int?count?=?r.Next( 1,?100 );
//Delegar, asociar función DoSetCounter
delegateSetCounter?sc?=?new?delegateSetCounter(DoSetCounter);
//Pasar en los votos restantes Delega parámetros y llama de forma asincrónica
this.BeginInvoke(sc, count);
//Pausa durante 2 segundos cada vez
Thread.Sleep (2000);
}
}
//La parte delegada simplemente muestra el valor pasado en una etiqueta en la interfaz
private?void?DoSetCounter(int?i_count)
{
lblCounter.Text?=?string.Format("{0} votos restantes",?i_count);
lblCounter.Text?=?string.Format("{0} votos restantes",?i_count);
p>
}
// El hilo comienza a ejecutarse. Si necesita abrir el programa, simplemente colóquelo en el evento Load.
privado?void?btnStart_Click(object?sender,?EventArgs?e)
{
bg.RunWorkerAsync();
}
//Pausa del hilo, si no necesita pausar, no lo use. Aquí hay solo una descripción del uso.
private?void?btnStop_Click(object). ?sender,?EventArgs?e)
{
bg.CancelAsync();
}
//Detener el hilo cuando el formulario está cerrado
¿protegido? override?void?OnFormClosing(FormClosingEventArgs?e)
{
base.OnFormClosing(e);
bg.CancelAsync();
}
}
}
Después de ejecutar, haga clic en el botón de cambio que hicimos "Iniciar "
Comenzará en la etiqueta Mostrar un número aleatorio de votos cada 2 segundos.
Otros controles y operaciones en el hilo de la interfaz de usuario no se bloquearán ni se bloquearán.
Un ejemplo de mecanografía puramente manual. . . Gracias por adoptar