StopNow(), Backup and cancellation tokens

Do you have any exception text? All I see is a ParseValue at the top.

What code exactly? This is restore, and earlier you pointed to backup.
I can offer general advice, but I don’t want to look at every bit of code.

As a general guess for those, look at the CoCoL Hello World example.
There’s usually a way to recognize an end-of-data situation, e.g. Linux
read returns 0 on end of file. I think CoCoL throws a RetiredException.

So look at where the exception catch is, relative to the channel reads.
Any catch has a scope to it, doesn’t it? Are they at high or low levels?

https://github.com/duplicati/duplicati/blob/master/Duplicati/Library/Main/Operation/Backup/Channels.cs
is what you will probably see backup use. That’s the only Channels.cs.

Following Channels.cs into their uses led to a description attempt here:

Channel Pipeline, which tries to also match the kenkendk writeup here.

The big concurrency addition in 2.0.3.6 looks (if you diff against 2.0.3.5) like BackupHandler.cs,
and RestoreHandler.cs got Fixed empty block handling in concurrent_processing branch #2637
and some interesting commentary on SQL readability, and knowing whether a rewrite is correct.
IMO this is an important question, because without it, code will get less stable rather than more.