La forma correcta de implementar una barra de progreso en C #

Estoy aprendiendo winforms y me he fijado el objetivo simple de hacer una barra de progreso que va de vacía a completa. Aquí está mi intento deforme:

public partial class Form1 : Form
{
    static BackgroundWorker bw = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerAsync();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i=0; i<100; ++i)
        {
            progressBar1.PerformStep();
            Thread.Sleep(10);
        }
    }
}

Estoy bastante seguro de que elThread.Sleep() es reprensible. ¿Cómo lo evito aquí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta