У меня есть несколько загрузок, работающих в потоках. Я хочу закрыть поток, скажем, когда пользователь нажимает паузу/остановку загрузки. Как я могу закрыть поток загрузок, запущенных в потоке?
stream.Close();
Вы можете использовать флаг в общей памяти и периодически проверять его из потока, чтобы определить, следует ли начинать ждать (или закрывать поток) или загружать следующий фрагмент.
Ну, один способ, которым вы можете это сделать, - это поток буфера в потоке, внутри цикла. Каждый раз, когда вы собираетесь захватить еще один фрагмент данных, проверьте, включено ли ваше свойство паузы. Если это так, просто пропустите итерацию, пока она не вернется к истине.
Таким образом, ваш поток не закрывается, но он приостанавливает загрузку любых дополнительных данных.
У вас может быть объект события (MaunalResetEvent\AutoResetEvent). Сигнал события, когда вам нужно остановить поток. В вашей потоковой проверке проверьте, сигнализировано ли событие, и прекратите обработку вместе с закрытием потока файлов.
Будет ли это работать? Просто предложение, я не супер горячий с потоками. Сохраняйте класс, обрабатывающий загрузку, будет ли это работать?
public class Threader
{
MyDownloader md;
public void UserClicksDownload()
{
md = new MyDownloader();
Thread t = new Thread(md.DownloadStuff);
t.Start();
Thread.Sleep(100);
}
public void UserClicksStop()
{
t.Abort();
t = null;
md.StopDownloading();
}
}
public class MyDownloader
{
public void DownloadStuff()
{
while (true)
{
Console.WriteLine("downloading stuff!");
}
}
public void StopDownloading()
{
Console.WriteLine("Tidy up you downloads here");
}
}
Вместо вызова thread.Abort()
вы можете использовать поток рабочего фона и использовать встроенное событие отмены.
Вы вызываете worker.CancelAsync()
, чтобы поднять событие. Это может быть нажатие кнопки или клавиши, например.
Затем в методе worker_DoWork
у вас есть следующее:
if (worker.CancellationPending)
{
// close the stream
}
else
{
// Carry on downloading
}
внутри вашего цикла, выполняющего загрузку