c# - 如何将 timer_ticker 设置为休眠,直到进程在后台完成
问题描述
我对 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();
}
推荐阅读
- selenium - 如何在 Selenium Webdriver 中的 sendkeys 中传递系统日期(非硬编码)
- javascript - 在 Windows 中测试/调试 Phonegap iOS 应用程序
- python - 两种方式去除重复的开始和结束节点
- sql - 将 CREATE TABLE 更改为 SELECT INTO 时 DATETIME 丢失 hh:mm
- ruby - 您的 Ruby 版本是 2.3.1,但运行 rails s 时您的 Gemfile 指定了 2.4.1
- java - 比较 SQL(Room Reservation WebApp)Java 中的元素
- kubernetes - 使用 yaml 文件进行 Kubernetes 滚动部署
- mysql - sed替换密码后以前工作代码上的MYSQL用户创建语法错误
- php - 带有 OAuth 2.0 的 Mantis 错误跟踪器
- http - go - 如何在go中将多个处理程序分配给同一个uri?