2016-03-28 11 views
1
public partial class JobDataDuplicatorForm : Form 
{ 
    public JobDataDuplicatorForm(IJobDataDuplicatorEngine engine) 
    { 
     _engine.CopyStartedEvent += GetEventHandler(OnCopyStarted); 
     _engine.CopyEndedEvent += GetEventHandler(OnCopyEnded); 
     ... 
    } 

    private static EventHandler GetEventHandler(Action action) 
    { 
     return (sender, args) => action(); 
    } 

    private void OnCopyStarted() 
    { 
     copyStatus.Text = "Copy progress: "; 
     generateButton.Enabled = false; // Cross-thread operation not valid 
    } 
} 

Ich habe die folgende Ausnahme:Wie man threadsafe GetEventHandler() erstellt?

Additional information: Cross-thread operation not valid: Control 
'generateButton' accessed from a thread other than the thread it was created on. 

Kann ich die Ausnahme beheben, indem GetEventHandler() Ändern anstatt jede Taste an verschiedenen Orten Umwickeln wie diese

Invoke((MethodInvoker)delegate { generateButton.Enabled = false; });?

Wie kann ich das tun?

+1

Sie rufen zufällig 'JobDataDuplicatorForm (IJobDataDuplicatorEngine engine)' von einem Hintergrund-Thread zunächst? –

+0

Aktualisiert, sieht so aus, als würde ich immer die alte Variante ausführen. Aber wie?? – Anatoly

+0

versuchen Sie gerade, die Tasten zu aktivieren und zu deaktivieren? – Sorceri

Antwort

2

Von Ihren Kommentaren haben Sie gesagt, Sie rufen JobDataDuplicatorForm(IJobDataDuplicatorEngine engine) von einem Hintergrund-Thread.

Ihre Klasse ist ein Form, alle Windows-Steuerelemente (die Form enthält) müssen zunächst auf dem UI-Thread erstellt werden oder Dinge wie Invoke und InvokeRequired brechen. Welcher Code den Konstruktor JobDataDuplicatorForm aufruft, muss diesen Aufruf vom UI-Thread ausführen.