2016-03-28 65 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控件(其中包括窗體)必須最初在UI線程上創建,或者像InvokeInvokeRequired中斷。無論代碼調用JobDataDuplicatorForm的構造函數都必須從UI線程執行該調用。