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
Post a Comment