私はタイマーとバックグラウンドスレッドのロジックを正しく取得しようとしています。私はすべての私の読書にもかかわらず、システム全体を完全に理解することはできません。以下は、関係のコードの抜粋です: 私のポーリングボタン:BackgroundWorkerスレッドとタイマーロジック
私は右、これまで私のバックグラウンドワーカースレッドだと思う
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;
}
私はほんの少しの他の薄いgs;私は正しいタイマーを使用しています(大したことだとは思いませんが、これは私がやりたいことのための最良のタイマーかもしれないと示唆されていました)。そして、DoWorkメソッドのUI要素を代理人によってのみ変更することができます。そうすることには重大な考慮が必要です。 長い投稿をお詫びし、お時間をありがとうございます。
私の心配は、あなたのタイマーがOnTimerEventを呼び出す実行中にdoWorkプロシージャが終了する(workCompleteに進む)ことです。あなたはちょうどスレッドでループをしたくないと確信していますか? – automatic
いいえできません。ソフトウェアを動かすロジックは、毎秒何らかの処理を行う必要があります –