The solution I use to this problem is to use a to-do heap, where I can only see what's on top of the heap. From there I can either delete the task or push it down further in the heap and move on to the next task.
By preventing myself from seeing more than one task at a time, I'm forced to focus on the task at the top of the heap, or make a reasonable decision as to how far down in the heap I want to defer it. Personally, I only use one heap, but I imagine a heap per project might work.
I use a prototype I built for myself at http://taskthing.com/ . I've since pivoted to working on flashcard spaced repitition algorithms for use on mobile devices.
I never go through the entire heap; there are some tasks down at the bottom that I'll probably never get around to, as I typically add more things each day than I take out. Usually I'll defer 3-5 tasks that I don't want to do at the moment before settling on working on one. Recurring tasks I'll just defer down again when I complete them.