C# 使用线程池搜索对象列表

C# 使用线程池搜索对象列表,c#,wpf,threadpool,C#,Wpf,Threadpool,我在列表中有这些容器对象(让我们称它们为容器)。每个容器对象在列表中依次有一个数据项(或派生项)。在典型场景中,用户将拥有15-20个容器对象,每个容器对象包含1000-5000个数据项。还有一些DataMatcher对象可用于不同类型的搜索。这些基本上都很好(因为我有几百个单元测试),但是为了让我的WPF应用程序感觉快速和响应,我决定使用ThreadPool来完成这项任务。因此,我有一个DataItemCommandRunner,它在容器对象上运行,基本上执行列表中的每个委托,它依次将每个Da

我在列表中有这些容器对象(让我们称它们为容器)。每个容器对象在列表中依次有一个
数据项
(或派生项)。在典型场景中,用户将拥有15-20个容器对象,每个容器对象包含1000-5000个
数据项。还有一些
DataMatcher
对象可用于不同类型的搜索。这些基本上都很好(因为我有几百个单元测试),但是为了让我的WPF应用程序感觉快速和响应,我决定使用
ThreadPool
来完成这项任务。因此,我有一个DataItemCommandRunner,它在容器对象上运行,基本上执行列表中的每个委托,它依次将每个
DataItem
作为参数;我使用
ThreadPool
为每个容器排队一个线程,这样理论上在多核计算机上搜索应该尽可能高效

这基本上是在DataItemUpdater类中完成的,该类类似于:

public class DataItemUpdater
{
    private Container ch;
    private IEnumerable<DataItemCommand> cmds;

    public DataItemUpdater(Container container, IEnumerable<DataItemCommand> commandList)
    {
        ch = container;
        cmds = commandList;
    }

    public void RunCommandsOnContainer(object useless)
    {
        Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
        foreach (DataItem di in ch.ItemList)
        {
            foreach (var cmd in cmds)
            {
                cmd(sh);
            }
        }
        //Console.WriteLine("Done running for {0}", ch.DisplayName);
    }
}
var someString = "123123123 - just some numbers";
我运行这个:

var res = someString.Contains("data");
当它运行时,它实际上会返回很多true-我有调试信息显示,对于空字符串和其他不包含数据的字符串,它会返回true。此外,即使字符串实际包含正在查找的数据,它有时也会返回false

这一切的关键?为什么我怀疑
线程池而不是我自己的代码

当我为主线程中的每个容器运行RunCommandsOnContainer()命令(即锁定UI和所有内容)时,它都能100%正确地工作-每次!它从不发现任何不该发现的东西,也从不跳过任何本该发现的东西

但是,只要我使用
线程池
,它就会开始查找许多不应该查找的项目,而有时却找不到它应该查找的项目

我意识到这是一个复杂的问题(调试是痛苦的,这是肯定的!),但任何关于为什么以及如何解决这一问题的见解都将不胜感激

谢谢


符文

从您发布的片段中有点难以看到,但根据症状判断,我将查看AllWordsMatcher(查找静态)。如果AllWordsMatcher是有状态的,您还应该检查您是否正在为每个线程创建一个新实例


更一般地说,我会查看匹配/搜索过程中涉及的所有实例,特别是多线程时使用的工作对象。根据过去的经验,问题通常就在那里。(在本例中,很容易过多地查看表示业务数据容器/数据项的对象图)

您走近了,我发现了它-它本身不是任何静态,而是一个在实例之间共享的类级变量。愚蠢的,愚蠢的错误,现在修复了。非常感谢!