我的timerTick()有问题,因为它每0.5秒执行一次,对我来说没问题,因为他每0.5秒检查一次connectetCard(),现在如果这样,他应该将它分配给_bw.DoWork中我分配给我的5秒运行时,如何将timerTick()再次触发,但仅在backgroundWorker中的进程完成时才能触发。
这是我的代码:
public FormMenu()
{
InitializeComponent();
SelectDevice();
establishContext();
timerBatch.Start();
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
}
private void timerBatch_Tick(object sender, EventArgs e)
{
if (connectCard())
{
cardUID = getcardUID();
if (cardUID != "Error")
{
using (DBEntities db = new DBEntities())
{
try
{
personData = db.Persons.Where(x => x.BATCH_ID == cardUID).FirstOrDefault();
if (maDaten == null)
{
labelInfo.Text = "Batch invalid.";
return;
}
else
{
person = db.Person.Where(x => x.LPE_ID == personData.MA_ID).FirstOrDefault();
_bw.DoWork += _bw_DoWork;
_bw.ProgressChanged += bw_ProgressChanged;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
_bw.RunWorkerAsync();
}
}
catch (Exception es)
{
MessageBox.Show(es.Message);
}
};
}
}
}
private void _bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 5; i >= 0; i -= 1)
{
if (_bw.CancellationPending) {
e.Cancel = true; return;
}
if (i == 0)
{
e.Cancel = true; return;
}
_bw.ReportProgress(i);
Thread.Sleep(1000);
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
labelInfo.Text = "Hello " + person.FirstName + " " + person.LastName + " " + e.ProgressPercentage.ToString();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
labelInfo.Text = labelInfo.Text.Trim();
}
尝试这样的事情:
public FormMenu()
{
InitializeComponent();
SelectDevice();
establishContext();
timerBatch.Start();
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
}
//CHANGE:
bool backgroundworkerRunning = false;
private void timerBatch_Tick(object sender, EventArgs e)
{
//CHANGE:
if (backgroundworkerRunning)
return;
if (connectCard())
{
cardUID = getcardUID();
if (cardUID != "Error")
{
using (DBEntities db = new DBEntities())
{
try
{
personData = db.Persons.Where(x => x.BATCH_ID == cardUID).FirstOrDefault();
if (maDaten == null)
{
labelInfo.Text = "Batch invalid.";
return;
}
else
{
person = db.Person.Where(x => x.LPE_ID == personData.MA_ID).FirstOrDefault();
_bw.DoWork += _bw_DoWork;
_bw.ProgressChanged += bw_ProgressChanged;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
//CHANGE:
backgroundworkerRunning = true;
_bw.RunWorkerAsync();
}
}
catch (Exception es)
{
MessageBox.Show(es.Message);
}
};
}
}
}
private void _bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 5; i >= 0; i -= 1)
{
if (_bw.CancellationPending) {
e.Cancel = true; return;
}
if (i == 0)
{
e.Cancel = true; return;
}
_bw.ReportProgress(i);
Thread.Sleep(1000);
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
labelInfo.Text = "Hello " + person.FirstName + " " + person.LastName + " " + e.ProgressPercentage.ToString();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//CHANGE:
backgroundworkerRunning = false;
labelInfo.Text = labelInfo.Text.Trim();
}