emanzione / PATCH

The PATCH repository for issues tracking, wiki and shared material.
https://assetstore.unity.com/packages/tools/utilities/p-a-t-c-h-ultimate-patching-system-41417
MIT License
47 stars 7 forks source link

Improve cancellation #62

Open DmitriyYukhanov opened 1 year ago

DmitriyYukhanov commented 1 year ago

Hey,

This one is related to #32, and I'm going to expand it a bit to a more detailed request.

It's currently not possible to cancel the download if something goes wrong and CDN does return errors making inner code throw.

But in catches, the IsCanceled flag is not checked, and it keeps trying again even if download was cancelled.

Adding if (IsCanceled) ... check before calling DownloadData.Create() could help too.

Also looks like DownloadData can't cancel and will make 3 attempts regardless.

Ideally, UpdatingContext.Runner should have a Cancel() method to cancel all internal downloaders in a currently executing step and skip not yet run steps (i.e. if it was cancelled while running Repairer, the following Updater won't even start).

Cleaning temporary data would be a great option on the top of this as well, but I believe it may deserve a dedicated feature request ticket.

Speaking of the cancellation itself, it would be great to introduce proper cancellation support through the CancellationToken while using either HttpClient async methods (it's not compatible with old Unity versions) or use IAsyncResult from the HttpWebRequest.BeginGetResponse() and similar in order to be able to immediately cancel operations.

Alternatively, cancellation could just terminate long-running tasks for the downloads.

The goal is to have 1 single API which can tell the context internals: "That's it! Let's cancel everything we do" and would immediately cancel anything happening under the hood =D