Вы можете создать таймер, чтобы пнуть делегата каждые n миллисекунд, и этот делегат мог поставить в очередь рабочий поток, чтобы сделать то, что уже делает ваш обработчик OnClick ().
Я бы НЕ писал это как однопоточное приложение, потому что, в зависимости от производительности веб-камеры пользователя, вы могли легко оказаться в вечном цикле обработки событий таймера, в результате чего ваш основной поток пользовательского интерфейса был бы постоянно заблокирован.
ThreadQueue.QueueUserWorkitem((args) =>
{
// Blah ...
}
не требует особых усилий для правильной работы.