我有一个函数,我想在一个单独的线程中执行,避免两个线程访问相同的资源。另外我想确保如果线程当前正在执行,则停止该线程并开始执行新线程。这就是我所拥有的:
volatile int threadCount = 0; // use it to know the number of threads being executed
private void DoWork(string text, Action OncallbackDone)
{
threadCount++;
var t = new Thread(new ThreadStart(() =>
{
lock (_lock) // make sure that this code is only accessed by one thread
{
if (threadCount > 1) // if a new thread got in here return and let the last one execute
{
threadCount--;
return;
}
// do some work in here
Thread.Sleep(1000);
OncallbackDone();
threadCount--;
}
}));
t.Start();
}
如果我触发该方法 5 次,那么所有线程都将等待锁,直到锁被释放。我想确保我执行最后一个线程。当线程正在等待成为锁的所有者时,我如何确定下一个拥有锁的线程。我希望他们按照我创建线程的顺序拥有资源......
编辑
我不是用 .net 4.0 创建这个应用程序。很抱歉没有提到我想要完成的事情。我正在创建一个自动完成控件,在其中过滤大量数据。我不希望主窗口在我想过滤结果时冻结。我还想根据用户类型过滤结果。如果用户一次输入 5 个字母,我想停止所有线程,我只会对最后一个感兴趣。因为锁会阻塞所有线程,有时我创建的最后一个线程可能首先拥有锁。