需求说明:edt文本输入框中连续输入文本,如果两次字符输入的间隔小于60毫秒,则不进行指定函数的触发,反之则触发指定函数。可用于判断条码枪输入或人工输入。
private BackgroundWorker _inputWorker = new BackgroundWorker();
//属性赋值和事件绑定
_inputWorker.WorkerReportsProgress = true;
_inputWorker.WorkerSupportsCancellation = true;
_inputWorker.DoWork += InputWorker_DoWork;
_inputWorker.ProgressChanged += InputWorker_ProgressChangedHandler;
_inputWorker.RunWorkerCompleted += InputWorker_RunWorkerCompletedHandler;
private void InputWorker_DoWork(object sender, DoWorkEventArgs e) {
if (!(sender is BackgroundWorker worker)) {
return;
}
try {
Thread.Sleep(60);
if (!_inputWorker.CancellationPending)
worker.ReportProgress(0);
} catch (Exception ex) {
_log.Error("InputWorker_DoWork 发生异常", ex);
}
}
private void InputWorker_ProgressChangedHandler(object sender, ProgressChangedEventArgs args) {
if (_inTxtChngTimer)
return;
_inTxtChngTimer = true;
try {
/*
要延迟执行的操作
*/
} finally {
try {
_inputWorker?.CancelAsync();
} catch { }
_inTxtChngTimer = false;
}
}
private void InputWorker_RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs args) {
//完成之后执行的操作,这里没啥操作,可以不写
}
//窗体的keydown事件,如果按下回车,则执行回车之后的操作,中断_inputWorker的操作
private void Frm_KeyUp(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Enter){
if (_inputWorker.IsBusy)
_inputWorker?.CancelAsync();
}
}
//相关编辑框的Txtchange事件
private void TxtCodeTextChanged(object obj) {
_inputWorker?.CancelAsync();//先停止
if (!string.IsNullOrEmpty(edt.Text.ToString()) && !_inputWorker.IsBusy) {
_inputWorker.RunWorkerAsync(); //通过条件判断再开启
}
}