C# has very good support for this.
You can even link cancellation tokens together and have different cancellation "roots".