Das Problem ist, dass nachdem du den Timer gestartet hast (also nach
wh.starte_timer()), die DoWork Methode vorbei ist und damit der BackgroundWorker nicht mehr läuft. Dann kannst du natürlich nicht mehr die ProgressChanged Methode aufrufen.
Aber da meiner Meinung nach das tick event sowieso nicht im GUI, bzw. dem Thread, der den Timer gestartet hast, brauchst du das doch alles garnicht mit dem BackgroundWorker.
Also im Grunde sowas:
class Program {
private WorkingHard _wh;
private void startWork() {
_wh = new WorkingHard();
_wh.Start();
_wh.StatusUpdate += (o,e) => this.Invoke(new Action<object, WorkingHardEventArgs>(wh_StatusUpdate), o, e);
}
private void updateParameters(Foo bar) {
_wh.updateParameter(bar);
}
private void wh_StatusUpdate(object sender, WorkingHardEventArgs e) {
this.progressBar.Value = e.Percentage;
}
}
class WorkingHard {
MMTimer _timer = new MMTimer();
public void Start() {
_timer.Start();
}
private void Tick() {
//Do something
OnStatusUpdate(42);
}
private void OnStatusUpdate(int percentage) {
if(StatusUpdate != null) StatusUpdate(percentage);
}
public event EventHandler<WorkingHardEventArgs> StatusUpdate;
}
class WorkingHardEventArgs : EventArgs {
public WorkingHardEventArgs(int percentage) {
_percentage = percentage;
}
private int _percentage = 0;
public int Percentage { get { return _percentage; } }
}
Falls das Tick-Event des MMTimers doch im gleichen Thread ausgeführt wird, in dem er erstellt wurde, mach die Start-Methode einfach so:
ThreadPool.QueueUserWorkItem(o => _timer.Start());
Darth Maim