Один из подходов, который вы могли бы использовать, - создать класс для каждой задачи. Затем пусть этот класс выполняет задачи. Он будет знать, можно ли использовать несколько задач одновременно, и ограничит доступ к каждой из них. Отсюда:
public class LongUploadTask
{
private bool isRunning;
public void Execute()
{
if(!isRunning)
{
//etc...
}
}
}
Обратите внимание, я пропустил код блокировки, если вы обращаетесь к нему из нескольких потоков, что я не думаю, что вы. Кроме того, если вы хотите выполнить это асинхронно, вы можете использовать асинхронные делегаты и события ручного сброса для достижения того, что делает ваш BackgroundWorker's.