The RSF-backed Prema driver - who lined up 10th on the grid - jumped Mikkel Jensen shortly after the start to circulate in ninth for the early part of the race, after which eighth fell into his lap when Motopark's Sergio Sette Canamara pulled in to serve a drive-through for a jump start.
From there on - with little chance of making further progress on fast-fading, old tyres - it was a case of seeing out the race in the hope that misfortune up ahead might net him a few extra points.
But when the safety car was scrambled on lap 19 - after Ryan Tveter spun a Turn 4 - it looked as if misfortune might be heading Dennis's way.
With the field bunched up, Dennis was put under immediate pressure on the restart by Jensen but managed to hang on for the remaining three laps to retain eighth.
Prema team-mate Felix Rosenqvist took win, leading every lap of the race from pole to claim victory by a margin of 1.3s ahead of Carlin's points-leader Antonio Giovinazzi.
Prema's Lance Stroll followed on in third to claim his maiden podium in the series.
It was Rosenqvist's seventh win of the season and moves him up to second in the standings, 17 points behind the Italian.
Charles Leclerc, who finished fourth, drops a place in the standings to third while Dennis remains fourth.
"A bit like second qualifying, the race was a bit of a shocker," said the RSF driver. "We suspected I had a bad set of tyres then, so decided to run them in the race to decide if that was the case or whether I had some other problem.
"It turns out I didn't - they were just as bad. I had random vibration from the front and a lack of grip compared to everyone else on the exit from corners.
"So realistically eighth was the best that was possible - albeit I wasn't so far off seventh at the end.
"The good thing is - provided it doesn't rain tomorrow - I should have a decent set of dry tyres for race three tomorrow."