Hi jpage101,
The issue you have is a common one when you start doing fancy stuff without really understanding how multi-threaded methods interact with your application :)
I don't know how your application works exactly, so I can only give you few hints on how we should solve this. Maybe having a small code review and check if you're using correctly consumer/producer pattern, optimize a bit resource lock (in objects which held results), etc. Also, if you don't mind using .net framework 4.5, using async/await feature could help a lot about app responsiveness :)
You've mentionned a point that tickled me a bit, that Tasks are not Threads, and in a way, this is not as efficient as using Threads.
You are right about Tasks not being Threads (not all the time, but very often). The power of using Tasks is that it simplifies parallel coding and also gives the opportunity to the system to optimize in the way it likes parallel executions :) (it can share resources, thus reducing system resources used like handles)
You are also right when you mean that the number of Tasks you create is not directly related to the number of Threads the running system can handle. But we doesn't care in TPL :) we let the system manages its resources. The only way to get the best performance with TPL is to try various number of parallel tasks and get the right tradeoff between speed, memory and CPU usage and app responsiveness.
Don't hesitate to contact me if my proposal sounds interesting :)
G.