asynchronous - C# Cancel Task with started List<> -


i started task lists , await task.whenall

private async void btn_download_click(object sender, eventargs e)     {         .         .         .         await downloadmultiplefilesasync(old_json);         console.writeline("download completed.");     } 

and that's code starting task list.

private async task downloadmultiplefilesasync(list<media> doclist)     {         var token = canceltokensource.token;         await task.whenall(doclist.select(doc => downloadfileasync(doc)));         btn_download.enabled = true;     } 

and download method

private async task downloadfileasync(media media) {     .     .     .     console.writeline(media.no + media_ext + " started.");     webclient.credentials = system.net.credentialcache.defaultnetworkcredentials;     await webclient.downloadfiletaskasync(new uri(media.url), @downloadtodirectory);     console.writeline(media.no + media_ext + " finished.");     .     .     . } 

the output window this:

1.jpg started. 2.jpg started. 3.jpg started. 4.jpg started. 5.jpg started. 6.jpg started. 7.jpg started. 8.jpg started. 9.jpg started. 10.jpg started. 11.jpg started. 12.jpg started. 13.jpg started. 14.jpg started. 15.jpg started. 16.jpg started. 17.jpg started. 18.jpg started. 19.jpg started. 1.jpg finished. 4.jpg finished. 2.jpg finished. 6.jpg finished. 8.jpg finished. 10.jpg finished. 3.jpg finished. 5.jpg finished. 12.jpg finished. 14.jpg finished. 7.jpg finished. 16.jpg finished. 18.jpg finished. 9.jpg finished. 11.jpg finished. 13.jpg finished. 15.jpg finished. 17.jpg finished. 19.jpg finished. download completed. 

i want click btn_cancel , cancel starting task , wait finish started task.

private void btn_cancel_click(object sender, eventargs e) {     canceltokensource.cancel();     canceltokensource = new cancellationtokensource(); } 

what need pass cancellation token down call chain use possible, need register cancel call call webclient.cancelasync() cancel download.

private async void btn_download_click(object sender, eventargs e) {     .     .     .     var token = canceltokensource.token;     try     {         await downloadmultiplefilesasync(old_json, token);         console.writeline("download completed.");     }     catch(operationcanceledexception ex)     {         //if other our token caused cancel bubble exception.         if(ex.cancellationtoken != token)             throw;     } }   private async task downloadmultiplefilesasync(list<media> doclist, cancellationtoken token) {     await task.whenall(doclist.select(doc => downloadfileasync(doc, token));     btn_download.enabled = true; }   private async task downloadfileasync(media media, cancellationtoken token) {     .     .     .     console.writeline(media.no + media_ext + " started.");     webclient.credentials = system.net.credentialcache.defaultnetworkcredentials;     try     {         using(token.register(() => webclient.cancelasync()))         {             await webclient.downloadfiletaskasync(new uri(media.url), @downloadtodirectory);         }     }                 catch (webexception ex)     {         //raise operationcanceledexception if request canceled, otherwise bubble exception.         if(ex.status == webexceptionstatus.requestcanceled)             throw new operationcanceledexception(token);         else             throw;     }     console.writeline(media.no + media_ext + " finished.");     .     .     . } 

Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -