2016-03-28 3 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 engine)'を呼び出していますか? –

+0

更新されました。私は常に古いバリアントを実行しているようです。しかし、どのように? – Anatoly

+0

ボタンを有効にしたり無効にしたりするだけですか? – Sorceri

答えて

2

あなたのコメントから、JobDataDuplicatorForm(IJobDataDuplicatorEngine engine)をバックグラウンドスレッドから呼び出したと言っています。

クラスはFormです。ウィンドウコントロール(フォームを含む)は、最初にUIスレッドまたはInvokeInvokeRequiredのようなものに作成する必要があります。どのようなコードでも、コンストラクタJobDataDuplicatorFormを呼び出す場合は、UIスレッドからその呼び出しを行う必要があります。