Я создал метод расширения для класса Random, который в случайное время выполняет Action (void delegate):
public static class RandomExtension
{
    private static bool _isAlive;
    private static Task _executer;
    public static void ExecuteRandomAsync(this Random random, int min, int max, int minDuration, Action action)
    {
        Task outerTask = Task.Factory.StartNew(() =>
        {
            _isAlive = true;
            _executer = Task.Factory.StartNew(() => { ExecuteRandom(min, max, action); });
            Thread.Sleep(minDuration);
            StopExecuter();
        });
    }
    private static void StopExecuter()
    {
        _isAlive = false;
        _executer.Wait();
        _executer.Dispose();
        _executer = null;
    }
    private static void ExecuteRandom(int min, int max, Action action)
    {
        Random random = new Random();
        while (_isAlive)
        {
            Thread.Sleep(random.Next(min, max));
            action();
        }
    }
}
Он отлично работает.
Но используется ли Thread.Sleep() в этом примере, или вы вообще никогда не используете Thread.Sleep(), какие могут быть осложнения? Существуют ли альтернативы?