traves todos thread subprocesos seguras requiere realizar que para otro make los llamar llamadas how función formularios form evaluación ejemplo ejecuten desde cross controles control como checkforillegalcrossthreadcalls calls acceder c# .net winforms synchronization backgroundworker

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

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!