Esta raro, acabo de probar tu código y no se me repite, yo por lo regular reasigno el sender del evento DoWork a una variable local, por que no pruebas:
Código:
BackgroundWorker worker = (BackgroundWorker)sender;
for (int i = 0; i < progres.Maximum; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(10);
worker.ReportProgress(i);
}
}