#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. Хорошо, итак, я воспользовался вашей идеей и попытался применить ее к разделу моего загружаемого файла. Загрузка происходит порциями, поэтому мне нужно выполнять цикл. Вот что у меня есть: