召回后台工作人员的正确方法
本文关键字:方法 后台 工作人员 召回 | 更新日期: 2023-09-27 17:54:20
在标题中,我有一些bgw我想调用每个按钮按下。这个代码正确吗?
private static BackgroundWorker bgw = null;
private void bttn_Click(...)
{
if(!bgw.IsBusy)
doSomeWorkInBg();
else
MessageBox.Show("Slow down a bit");
}
private void doSomeWorkInBg()
{
if (bgw == null)
{
bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
}
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
// do some work that takes time
}
或者我应该添加RunWorkerCompleted事件与"bgw = null;"代码或类似的东西?
- 您应该避免将
- 当我需要根据UI事件频繁地重新运行worker时,我通常使用以下结构:
bgw
设置为静态,因为您正在非静态上下文中使用它。bool ShouldRunWorkedASAP; private void bttn_Click(...){ ShouldRunWorkedASAP=true; if (!bgw.IsBusy) bgw.RunWorkerAsync(); } private void bgw_DoWork(object sender, DoWorkEventArgs e) { while (ShouldRunWorkedASAP) { ShouldRunWorkedASAP=false; // do some work that takes time } }
这假定在类构造函数中实例化了工作对象。基本上,这段代码设置了worker应该在UI事件发生时尽快运行的标志,然后尝试运行worker。如果它已经在运行,那么worker实现中的while()循环将在作业完成后立即为下一次运行调度作业。
这段代码并不能确保worker将运行用户按下按钮的次数,也不能确定在你的情况下是否需要这样做。