This code looks really strange to me - we do t.invoke and then will always throw TimeoutException if timeout was set to 0.
And we support a timeout of "always" - is that yagni coding or is there some use-case I'm not thinking of?!

I know you've only moved this code so not suggesting doing anything in this pull request...