I looked at bit more at the code and I found that since the
TaskManager.QueueTask method queues the task that it should run it will block if one of those tasks stops running for some reason. If it crashes this will be handled but if it stops then there is no way this can be detected. So I'm guessing that some task is blocking the taskmanager from contiunuing on to the next task, thereby producing the symptoms that you describe.
This is further backed by the fact that it always works if you execute the task directly instead of queuing it in the background.
The reason for using a task manager in the background instead of a direct thread is that a taskmanager will be easier for a low end computer to handle rather than a whole bunch of threads trying to execute at the same time.
The start / end / crash of background tasks is all logged in the debug file so you should be able to see what task is not completing there.