c# - todos - ¿Aprovechando BackGroundWorker para la invocación de hilos cruzados de acciones GUI en controles Winforms?
realizar llamadas seguras para subprocesos en controles de formularios windows forms (1)
No hay necesidad de abrir un hilo solo por eso. Simplemente use SynchronizationContext
, así:
private readonly SynchronizationContext _syncContext;
public MainForm()
{
InitializeComponent();
_syncContext = SynchronizationContext.Current;
}
void InvokeViaSyncContext(Action uiAction)
{
_syncContext.Post(o =>
{
if (IsHandleCreated && !IsDisposed) uiAction();
}, null);
}
public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncContext(() => MyTextBox.Text = "Hello from another thread!"));
}
Inspirado por mi propia experiencia con aplicaciones multiproceso de Winforms, así como preguntas como
- ¿Evitando los problemas de Invoke / BeginInvoke en el manejo de eventos WinForm de cruce de hilos?
- Evite llamar a Invoke cuando el control esté dispuesto
He encontrado un patrón muy simple, cuya solidez me gustaría verificar.
Básicamente, estoy creando (y ejecutándolo durante toda la vida de la aplicación) un BGW cuyo único propósito es la sincronización de las solicitudes de invocación. Considerar:
public MainForm()
{
InitializeComponent();
InitInvocationSyncWorker();
}
private void InitInvocationSyncWorker()
{
InvocationSync_Worker.RunWorkerAsync();
}
private void InvocationSync_Worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(Timeout.Infinite);
}
void InvokeViaSyncWorker(Action guiAction)
{
InvocationSync_Worker.ReportProgress(0, guiAction);
}
private void InvocationSync_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (IsDisposed) return; //we''re in the GUI thread now, so no race condition right?
var action = (Action) e.UserState;
action();
}
public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncWorker(() => MyTextBox.Text = "Hello from another thread!"));
}
Por supuesto, no es el enfoque más económico (mantener vivo un hilo así), pero si funciona y no me he perdido nada, seguro que es el más simple que he visto.
¡La regeneración es muy apreciada!