Я пытаюсь получить логику для моего таймера и фонового рабочего потока. Конечно, я не совсем понимаю всю систему, несмотря на все мои чтения. Ниже приводятся выдержки из кода заинтересованного: Моя кнопка опроса:BackgroundWorker thread и Timer logic
private void pollStart_Click(object sender, EventArgs e)
{
tst_bgw = new BackgroundWorker();
//mandatory. Otherwise will throw an exception when calling ReportProgress method
tst_bgw.WorkerReportsProgress = true;
//mandatory. Otherwise we would get an InvalidOperationException when trying to cancel the operation
tst_bgw.WorkerSupportsCancellation = true;
tst_bgw.DoWork += tst_bgw_DoWork;
tst_bgw.ProgressChanged += tst_bgw_ProgressChanged;
tst_bgw.RunWorkerCompleted += tst_bgw_RunWorkerCompleted;
tst_bgw.RunWorkerAsync();
}
, который я считаю правильным до сих пор
мой фон рабочего потока:
private void tst_bgw_DoWork(object source, DoWorkEventArgs e)
{
m_timer = new System.Timers.Timer();
m_timer.Interval = 1000;
m_timer.Enabled = true;
m_timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
if (tst_bgw.CancellationPending)
{
e.Cancel = true;
return;
}
}
и истекшее код уровня события:
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
if (powerVal > 3250)
{
m_timer.Stop();
tst_bgw.CancelAsync();
}
else
{
string pow;
int progressVal = 100 - ((3250 - powerVal)/timerVal);
uiDelegateTest tstDel = new uiDelegateTest(recvMessage);// the recvMessage function takes a textbox as an argument and directs output from socket to it.
pow = construct_command("power", powerVal);
sData = Encoding.ASCII.GetBytes(pow);
if (active_connection)
try
{
m_sock.Send(sData);
Array.Clear(sData, 0, sData.Length);
tstDel(ref unit_Output);// Read somewhere that you can only modify UI elements in this method via delegate so I think this is OK.
m_sock.Send(time_out_command);
tstDel(ref unit_Output);
tst_bgw.ReportProgress(progressVal);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
tst_bgw.ReportProgress(powerVal, progressVal);
powerVal = powerVal + pwrIncVal;
}
Я просто хотел бы узнать еще несколько тонких гс; я использую правильный таймер (не то, что я думаю, что это должно иметь большое значение, но было высказано предположение, что это может быть лучшим таймером для того, что я хочу делать) и может действительно изменить элементы пользовательского интерфейса в методе DoWork только через делегатов, и если да, для этого существуют особые соображения. Прошу прощения за длинную публикацию и благодарю вас за ваше время.
Мое беспокойство заключается в том, что процедура doWork завершит работу (завершение работыComplete), пока ваш таймер все еще работает, вызывая OnTimerEvent. Вы уверены, что вам просто не нужен цикл с thread.Sleep в методе do do? – automatic
Нет, я не могу. Логика, управляющая программным обеспечением, требует, чтобы я делал некоторую обработку каждую секунду. –