The engine will return if a restart is required in the ApplyComplete()
callback to your bootstrapper application. You can either decide at that moment to accept the restart and return Result.Restart
from the ApplyComplete()
callback.
Alternatively, you may want to prompt the user on a finish dialog or something to give them an option to accept the restart or not. In that case, you can return Result.Restart
from the Shutdown()
callback and the engine will do a restart after your bootstrapper application exits.
I tend to do use the second option most often in my bootstrapper applications.