Если мы говорим о многопоточности для синхронизации потоков используйте объекты синхронизации (например ManualResetEvent). Тогда не надо городить всю эту идею с callback'ами
и вот этот убогий код
while (SendDispenseAllCoins)
{
Thread.Sleep(100);
}
можно заменить 1 строчкой, например такой
mre.WaitOne(TimeSpan.FromMinutes(1))
Это в случае ручного создания потоков.
Но если у вас .net 4.5 рекомендую не заниматься ручным созданием потоков а использовать "Асинхронный шаблон, основанный на задачах" (TAP), а именно конструкции async-await и Task'и