我有一个函数,我想在一个单独的线程中执行,避免两个线程访问相同的资源。 我还想确保如果线程当前正在执行,则停止该线程并开始执行新线程。这就是我所拥有的:
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 个字母,我想停止所有线程,我只对最后一个感兴趣。因为锁会阻塞所有线程,有时我创建的最后一个线程可能首先拥有锁。
最佳答案
我认为你把这个复杂化了。如果您能够使用 4.0,则只需使用 Task Parallel Library .有了它,你可以设置一个 ContinueWith函数,以便必须按特定顺序发生的线程按照您指定的顺序完成。如果这不是您想要的,那么我实际上建议您不要使用线程,因为这听起来像是您试图强制进入并行性的同步操作。
如果您只是想取消任务:那么 here is a SO question on how to cancel TPL tasks.如果您只是要丢弃除最后一个以外的所有资源,为什么要浪费资源。
如果您不使用 4.0,那么您可以使用 Background Worker 完成同样的事情.它只需要更多的样板代码来完成同样的事情:)
关于c# - 确保特定线程接下来运行(获取资源)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159209/