我很难过。我有一些代码出来并搜索我的数据库。它同时进行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显示我只使用了一些。)
任何人都知道什么可能导致我的线程阻塞?
更新:
我尝试在function
的集合中只有一个functions
,并且在通过线程方法运行时没有发生阻塞。但是如果我再添加一个它就会阻塞。所以两件或两件以上的东西会导致这种情况。
答案 0 :(得分:1)
循环中的每次迭代都会写入相同的共享List<T>
。
尝试在并行版本的列表中添加锁定,看看挂起是否消失。