2016-03-28 2 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 
    } 
} 

У меня есть следующее исключение:Как создать потокобезопасный GetEventHandler()?

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

Могу ли я исправить исключение, изменив GetEventHandler() вместо закручивания каждой кнопки в разных местах, как этот

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

Как это сделать?

+1

Вы случайно вызываете 'JobDataDuplicatorForm (движок IJobDataDuplicatorEngine)' из исходного потока? –

+0

Обновлено, похоже, что я всегда исполняю старый вариант. Но как?? – Anatoly

+0

Вы просто пытаетесь включить и отключить кнопки? – Sorceri

ответ

2

От ваших комментариев вы сказали, что вы вызываете JobDataDuplicatorForm(IJobDataDuplicatorEngine engine) из фоновой темы.

Ваш класс Form, любые элементы управления Windows (которые включают в себя форму) должны быть изначально созданы в потоке пользовательского интерфейса или в таких вещах, каки InvokeRequired. Какой бы код вызывал конструктор JobDataDuplicatorForm, этот вызов должен выполняться из потока пользовательского интерфейса.

Смежные вопросы