The Racing Steps Foundation driver, starting from sixth on the grid, launched himself past Signature's Alexander Albon and Carlin's George Russell as the race got underway but was beaten to third by Gustavo Menezes.
The American made a lighting start to scythe his way through the pack from eighth.
Up ahead Van Amersfoort's Charles Leclerc, starting from pole, held off an early challenge from Antonio Giovinazzi at Turn 1 to lead away the field.
But within two laps the jockeying for position was brought to a halt as the first of two safety cars emerged while early spinner Lance Stroll's Prema car was cleared from the Luffield exit.
When racing resumed two laps later, the lead four held position all the way to lap 16 when the safety car emerged for the second and final time to set up a two-lap sprint to the finish.
The culprit this time around was Pietro Fittipalidi who spun at Village beaching his Fortec car on the kerb.
As the racing got underway for the final time Leclerc mastered the restart to retain the lead while Dennis capitalised on what appeared to be an error by Menezes at Turn 4 to relieve the Carlin driver of third.
That left a relieved Leclerc - who had resisted race-long pressure from Giovinazzi - to take the chequered flag just under half a second clear of the Italian. Dennis followed on a further 2.8 seconds adrift. Menezes finished fourth.
"He made a slight mistake of some sort and lost a lot of time on the exit and I managed to get past him on the straight," Dennis explained. "So all in all, despite a couple of problems with the car, it's been quite a respectable weekend for me."
Giovinazzi, courtesy of three podium finishes, leads the driver standings on 51 points at the end the weekend, eight clear of Leclerc. Dennis is fifth on 30.