c# - 确保特定线程接下来运行(获取资源)?

标签 c# multithreading locking

我有一个函数,我想在一个单独的线程中执行,避免两个线程访问相同的资源。 我还想确保如果线程当前正在执行,则停止该线程并开始执行新线程。这就是我所拥有的:

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/

相关文章:

c# - 如何在 WPF 4.0 中创建发光的文本框?

python - 读取一个文件并做一些事情,多线程

c# - 索引超出范围抛出但索引并没有真正超出范围

c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?

c++ - 为在 BeagleBone Black 上运行的 ARM 编译时,应用程序 boost::thread 卡在互斥锁上

c# - 锁定对象

c# - 如何从列表中删除空字符串,然后从列表中删除重复值

c# - 为什么EventHandlers对象参数只是一个对象类型?

c# - 使用 wpf 3D 图形将 3d 模型显示为 3D 网格对象

java - java中ThreadFactory的使用