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

时间:2014-09-22 22:26:03

标签: c# multithreading wcf

我很难过。我有一些代码出来并搜索我的数据库。它同时进行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,并且在通过线程方法运行时没有发生阻塞。但是如果我再添加一个它就会阻塞。所以两件或两件以上的东西会导致这种情况。

1 个答案:

答案 0 :(得分:1)

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

尝试在并行版本的列表中添加锁定,看看挂起是否消失。