所以我有一个使用 filesystemWatcher 并很好地触发事件的应用程序。FSW 将触发一堆非常接近的时间。我想创建一个在上次触发 FSW 后一小时触发的函数。
我首先尝试使用后台工作人员:(为清楚起见,所有代码都被缩短了)
namespace Devo
{
public partial class Form1 : Form
{
BackgroundWorker bw = new BackgroundWorker();
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
if (bw.IsBusy)
{
bw.CancelAsync(); //this is to, in a way, reset the timer for the delayed method.
}
//do a lot of stuff
bw.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
while(sw.ElapsedMilliseconds < 180000)
{
if (bw.CancellationPending == true)
{
sw.Stop();
sw.Reset();
e.Cancel = true;
return;
}
}
sw.Stop();
sw.Reset();
DelayedMethod();
}
}
}
这不起作用,因为第二次bw.RunWorkerAsync()
调用它显然很忙,即使调用bw.CancelAsync()
.
我的下一次尝试涉及一个常规线程,因为我在 SO(现在找不到链接)的某个地方读到了一个无法像我尝试做的那样“重新启动”backgroundWorker 的内容。
线程尝试几乎相同,但我想我会尝试,因为 backgroundWorker 中可能存在一些常规线程中不存在的约束。我想。
namespace Devo
{
public partial class Form1 : Form
{
Thread PWC_counter_thread = new Thread(PWC_Counter);
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
if (PWC_counter_thread.IsAlive)
PWC_counter_thread.Abort();
//do a lot of stuff
PWC_counter_thread.Start();
}
static void PWC_Counter()
{
Thread.Sleep(180000);
DelayedMethod();
}
}
}
但这给了我同样的错误。在第二个电话PWC_counter_thread.Start()
是忙。
我假设在第二个线程等待时不存在竞争条件,在本例中为 3 分钟,并且初始 FSW 方法需要整整一秒才能执行,因此我相信对 .Abort() 的调用和.CancelAsync() 都在各自的方法完成之前完成。
现在的问题:
是否可以以我尝试的方式重新启动线程?如果是这样,我做错了什么?
我应该以另一种方式延迟我的方法调用吗?如果是这样,提示?
编辑/更新/解决方案
我从来没有像我想要的那样启动和停止线程工作,所以我找到了另一种解决我的情况的方法。
情况是我有第二个线程作为一种计时器,它会在设定的时间后调用一个方法。我的第一个线程做了一些工作,完成后它将启动第二个线程。如果第一个线程在计时器线程完成之前再次启动,它应该杀死线程并重新启动它。对我来说,这证明很难达到我想要的方式。所以我改为采用另一种方法来实现我想要的最终结果。我没有重新启动线程,而是简单地重新启动了我的第二个线程用作计数器的秒表。这给了我想要的结果。这可能是不好的做法,但它有效。