Private/Thread.ps1

function StartThread([ScriptBlock]$scriptBlock, $arguments, $psHost)
{
    if ($psHost)
    {
        $runspace = [RunSpaceFactory]::CreateRunspace($psHost)
    }
    else
    {
        $runspace = [RunSpaceFactory]::CreateRunspace()
    }
    $runspace.Open()

    $powershell = [PowerShell]::Create()
    $powershell.Runspace = $runspace
    $powershell.AddScript($scriptBlock.ToString())
    $powershell.AddArgument($arguments)

    $asyncHandle = $powershell.BeginInvoke()

    $thread = [PSCustomObject]@{
        Runspace = $runspace
        Powershell = $powershell
        AsyncHandle = $asyncHandle
    }
    $thread
}

function StopThread($thread)
{
    $thread.Runspace.Dispose()
    $thread.Powershell.Dispose()
}