线程导致阻塞;同步时不存在
本文关键字:同步 不存在 线程 | 更新日期: 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>
。
在并行版本中,试着在列表中添加写操作周围的锁,看看挂起的问题是否会消失。