2016-04-13 14 views
1

フォーム外の別のクラスのメソッドを呼び出すBackgroundWorkerスレッドからラベルを更新しようとしています。だから私は基本的にこれをしたい:WinForms UIを更新するBackgroundWorkerスレッド

MainForm.counterLabel.Text = Counter.ToString(); 

しかし、ラベルはプライベートです。私はBackgroundWorkerのprogressupdate関数、呼び出しなどを使用するようなことを調べましたが、必要なものではないようです。ここ

は、私のコードのいくつかのより多くのです:

のMainForm:

clickThread.DoWork += (s, o) => { theClicker.Execute(speed); }; 
clickThread.RunWorkerAsync(); 

クラス/メソッドと呼ばれる:

public void Execute(int speed) 
{ 
    while (running) 
    { 
     Thread.Sleep(speed); 
     Mouse.DoMouseClick(); 
     Counter++; 
     //Update UI here 
    } 
} 

私は過度に少し私のコードを複雑にしていると思います: \そして自分自身をコーナーに戻しました。

+0

ラベルがプライベートであれば、あなたはそれを設定するためのメソッドやプロパティを公開していますか? – Hendry

+0

問題を理解する:オブジェクト "theClicker"は、MainFormのプライベートラベルにアクセスできません。この問題を解決する本当に貧弱な方法は、ラベルを "theClicker"のExecuteメソッドに渡すことです。 – Shamshiel

+5

BWの基本はDoWork内からUIにアクセスするのは簡単ではありません**。 'ProWorkChanged'の' DoWork'とUIのUIのものではないものを行います。 –

答えて

2

UIを更新するには、ProgressChanged -Eventを使用する必要があります。

internal static void RunWorker() 
{ 
    int speed = 100; 
    BackgroundWorker clickThread = new BackgroundWorker 
    { 
     WorkerReportsProgress = true 
    }; 
    clickThread.DoWork += ClickThreadOnDoWork; 
    clickThread.ProgressChanged += ClickThreadOnProgressChanged; 
    clickThread.RunWorkerAsync(speed); 

} 

private static void ClickThreadOnProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 

    someLabel.Text = (string) e.UserState; 

} 

private static void ClickThreadOnDoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = (BackgroundWorker)sender; 
    int speed = (int) e.Argument; 

    while (!worker.CancellationPending) 
    { 
     Thread.Sleep(speed); 
     Mouse.DoMouseClick(); 
     Counter++; 
     worker.ReportProgress(0, "newText-Parameter"); 
    } 
} 

}

+1

誰がBGWの唯一の正しい使い方をdownvotedですか? Tasksの使用がより簡単で簡単だと主張することもできますが、それは目的作成のProgressChangedイベントを使用することが間違っていることを意味するものではありません。 –

+0

私はこの解決策が一番良いと思います。私は自分自身がExecuteメソッドのための別のクラスを持っているという考えに結婚しようと思っています。私がリファクタリングして動作すると、私はこの答えを受け入れます。 – James

+0

「someLabel.Text =(string)e.UserState;」ということに注意してください。メソッドが静的であるために機能しません。 – James

-3

メソッドを呼び出すようにしてください:BackgroundWorkerのためのコードは次のようになります。

例の場合

: -

this.Invoke((Action)(() => Resources.xobjMF.Enabled = true)); 
関連する問題