Обработка потоков, позволяющая отменить веб-запрос

#c# #multithreading #webrequest

#c# #многопоточность #веб-запрос

Вопрос:

Я пишу веб-приложение, которое позволяет пользователям загружать большие файлы по веб-запросу http. Мне нужно предоставить им возможность отменить запрос, поэтому я создаю поток для запроса. Но, пока происходит загрузка, я все еще не могу запустить событие cancel. Что я делаю не так? Спасибо за любой вклад!

 public class downloadThread  { 
           public int isResume;
           public void downloadImage()
            { }
        }
            protected void btnDownload_Click(object sender, EventArgs e)
            {       var x = new downloadThread();
                    x.isResume = 0;

                    tRequest = new Thread(new ThreadStart(x.downloadImage));
                    tRequest.Start();
                    while (tRequest.IsAlive)
                    {
                      DownloadImage(); //this is where the rest request happens 
                    } }
            protected void btnCancelRequest_Click(object sender, EventArgs e)
            {
                if (tRequest != null amp;amp; tRequest.IsAlive)
                {

                    tRequest.Abort();

                }
            }
  

Комментарии:

1. Разве ваш цикл while внутри btnDownload_Click не блокирует вызов, даже если вы используете потоки? пока поток запроса активен (загрузка файла), вы выполняете DownloadImage(), поэтому, возможно, bcoz этого btnCancelRequest_Click не срабатывает

Ответ №1:

Прерывание потока с помощью thread.Возможно, прерывание — это не тот способ, которым вы хотите это сделать.

Как насчет асинхронного веб-запроса в вашем методе DownloadImage вместо этого? (См. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx ). Таким образом, вы можете вызвать веб-запрос.Метод прерывания вместо прерывания потока.

Комментарии:

1. Хорошо, итак, я воспользовался вашей идеей и попытался применить ее к разделу моего загружаемого файла. Загрузка происходит порциями, поэтому мне нужно выполнять цикл. Вот что у меня есть: