I prefer to use Start-Job to run invoke-command so that I can watch and handle the jobs on the central machine using Get-Job.
When I loop through the "list of remote computers" I use the "current computer name" as the -Name parameter in the Start-Job so that I can watch each job individually and as a group.
Just my two cents from experience.
Edit Example:
$job =
{
$remoteJob = { ##Do Stuff Here }
Invoke-Command -ComputerName $args[0] -ScriptBlock $remoteJob
}
Start-Job -Name <jobName> -ScriptBlock $job -ArgumentList <remoteComputer>
To your question about why the Job "never finishes" I don't have input other than, make sure the code you are running remotely does actually end.
Hope this helps