C# has very good support for this.

You can even link cancellation tokens together and have different cancellation "roots".