Вам не нужны и BackgroundWorker, и Timer для достижения вашей цели. Из того, что вы опубликовали, похоже, что вы хотите, чтобы пользователь нажал кнопку, которая запускает процесс опроса, который завершается в определенной точке.
Ваша модель опроса действительно предполагает, что таймер будет работать нормально.
Если вы используете таймер, я бы инициализировал таймер после вызова InitializeComponent () чем-то вроде
private void InitializeTimer()
{
this.timer = new Timer();
int seconds = 1;
this.timer.Interval = 1000 * seconds; // 1000 * n where n == seconds
this.timer.Tick += new EventHandler(timer_Tick);
// don't start timer until user clicks Start
}
Нажатие кнопки просто
private void button_Click(object sender, EventArgs e)
{
this.timer.Start();
}
Затем на отметке timer_Tick вам нужно будет выполнить опрос, и вы сможете обновить свой пользовательский интерфейс оттуда, если таймер находится в потоке пользовательского интерфейса, как это
void timer_Tick(object sender, EventArgs e)
{
if( determineIfTimerShouldStop() )
{
this.timer.Stop();
}
else
{
// write a method to just get the power value from your socket
int powerValue = getPowerValue();
// set progressbar, label, etc with value from method above
}
}
Однако, если поток таймера не находится в том же потоке, что и пользовательский интерфейс, вы получите исключение при попытке обновить пользовательский интерфейс. В этом случае вы можете использовать Invoke, о котором упоминает DataDink , и сделать что-то подобное
void timer_Tick(object sender, EventArgs e)
{
if( determineIfTimerShouldStop() )
{
this.timer.Stop();
}
else
{
// write a method to just get the power value from your socket
int powerValue = getPowerValue();
// set a label with Invoke
mylabel.Invoke(
new MethodInvoker( delegate { mylabel.Text = "some string"; } )
);
}
}
Учитывая код, который вы разместили, вам действительно не нужно было использовать и BackgroundWorker, и Timer, но у меня были случаи, когда я использовал BackgroundWorker для выполнения работы при вызове таймера, чтобы я мог обновить его Пользовательский интерфейс периодически и ручная кнопка для обновления пользовательского интерфейса. Но я обновлял свой интерфейс не так, как вы.
Если у вас все еще есть необходимость сделать и то и другое, вот, примерно, как вы можете запустить свое приложение ...
- Создать
Метод InitailizeBackgroundWorker ()
вместе с InitializeTimer, так что у вас есть
это уже инициализировано до
Таймер срабатывает.
- Затем установите Timer.Tick
позвонить
BackgroundWorker.RunWorkerAsync ()
- Затем вы можете делать все обновления пользовательского интерфейса из RunWorkerAsync:
с использованием
BackgroundWorker.ReportProgress ().