Executar tarefa em segundo plano no aplicativo WPF

Exemplo

private void Start(object sender, RoutedEventArgs e)
{
    int progress = 0;
    for (;;)
    {
        System.Threading.Thread.Sleep(1);
        progress++;
        Logger.Info(progress);
    }
}

Qual é a abordagem recomendada (TAP ou TPL ou BackgroundWorker ou Dispatcher ou outros) se eu quiser Start ()

não bloqueie o thread da interface do usuáriopode fornecer relatórios de progressopode ser canceladosuporte multithread e multicore

questionAnswers(3)

yourAnswerToTheQuestion