The BMC rider, who also won the time-trial on the opening day, finished the 32km route in 37:57, with teammate Joey Rosskopf second and Team Sky’s Jonathan Castroviejo third.
The stage, after the second and final rest day, slightly reshuffled the overall standings, with LottoNL-Jumbo’s Steven Kruijswijk moving up to third, 52 seconds behind overall leader Mitchelton-Scott’s Simon Yates.
Yates, who placed 13th today, retained his red jersey and extended his lead, gaining seven seconds on Movistar Team’s Alejandro Valverde.
The route featured two intermediate check points, with the first at 10.5km and the second at 20km.
Trek-Segafredo’s Matthias Brandle was the first rider off the ramp and reached the 20km mark in 29:16. After 18 riders had passed the 10.5km mark, Brandle was still in the lead. His eventual finishing time was 40:16.
Quick-Step Floors’ Kasper Asgreen went through the second time-check a minute faster than Brandle, which put him in the lead.
Dennis, who was today’s favourite, started in 65th position out of 166 riders and set a new quickest mark of 37:57, ahead at that stage of Castroviejo, with Asgreen third fastest.
However Rosskopf, an American time-trial champion, replaced Castroviejo in second when he finished his time-trial one minute and 50 seconds behind Dennis, with Castroviejo moving into third.
Dennis kept his fastest time to the end to eventually win the stage.
The Australian also announced that he will leave the tour to prepare for the team and individual time-trials at the upcoming road world championships.
“Today, I tried to control it at the start and finish and make my move in the middle section and it worked out perfectly. To be honest, the big performance of the day I’d have to give to Joey.
“I’m heading home now and just preparing for the time-trials at Worlds.”