线程导致阻塞;同步时不存在

本文关键字:同步 不存在 线程 | 更新日期: 2023-09-27 18:23:54

我被难住了。我有一段代码,可以用来搜索我的数据库。它同时进行7种不同的搜索。

为了让它们同时运行,我使用线程。我试过几种不同的方法来称呼它,但现在我用的是这样的东西:

var encounterResults = new List<IODataList<ISearchResultItem>>();
Parallel.ForEach(functions, function =>
{
    var results = function(searchParam, ClientId);
    encounterResults.Add(results);
});

当它自己运行时,一切都很好。

但是,当我的用户单击"保存"按钮时,我会异步调用WCF服务操作。在调用该服务操作时,如果用户触发搜索(使用上面的代码),则搜索将等待WCF服务操作完成,然后搜索完成。

我看不到搜索关心的、保存按钮也关心的任何内容。(他们不共享任何对象。)

只是为了好玩,我试着把我的搜索改成这个

foreach (var function in functions)
{
    var results = function(searchParam, ClientId);
    encounterResults.Add(results);
}

当我这样(同步)运行它时,保存按钮没有问题。(搜索未被阻止。)

但我的一些搜索可能需要一段时间,所以我担心只是同步。

我已经试过了我能想到的一切,看看是什么导致了这个障碍,但我被难住了。我想知道这是否与线程本身有关。(例如,我认为我可能没有线程,但ThreadPool.GetAvailableThreads显示我只使用了几个。)

有人知道是什么原因导致我的线程阻塞吗?

更新:

我尝试在我的functions集合中只有一个function,当通过线程方法运行时没有发生阻塞。然而,如果我再加一个it块。所以两个或两个以上的东西在一起会导致这种情况。

线程导致阻塞;同步时不存在

循环中的每个迭代都写入相同的共享List<T>

在并行版本中,试着在列表中添加写操作周围的锁,看看挂起的问题是否会消失。