Закрытие потока в потоке, который уже запущен [C #]

2

У меня есть несколько загрузок, работающих в потоках. Я хочу закрыть поток, скажем, когда пользователь нажимает паузу/остановку загрузки. Как я могу закрыть поток загрузок, запущенных в потоке?

  • 0
    Не могли бы вы рассказать нам, что мешает вам просто закрыть поток в потоке, который использует поток?
Теги:
multithreading
stream

6 ответов

6
stream.Close();
  • 4
    Можете ли вы дать более краткий ответ?
  • 0
    Я не думаю, что это может стать более кратким. Просто закройте поток. Что тебе мешает?
4

Вы можете использовать флаг в общей памяти и периодически проверять его из потока, чтобы определить, следует ли начинать ждать (или закрывать поток) или загружать следующий фрагмент.

1

Ну, один способ, которым вы можете это сделать, - это поток буфера в потоке, внутри цикла. Каждый раз, когда вы собираетесь захватить еще один фрагмент данных, проверьте, включено ли ваше свойство паузы. Если это так, просто пропустите итерацию, пока она не вернется к истине.

Таким образом, ваш поток не закрывается, но он приостанавливает загрузку любых дополнительных данных.

0

У вас может быть объект события (MaunalResetEvent\AutoResetEvent). Сигнал события, когда вам нужно остановить поток. В вашей потоковой проверке проверьте, сигнализировано ли событие, и прекратите обработку вместе с закрытием потока файлов.

  • 0
    Thread.Abort является ядерной опцией, и ее следует избегать при обычной обработке (такой как пользовательская операция «пауза» или «отмена»). См. Interactive-sw.co.uk/iangblog/2004/11/12/cancellation для обсуждения проблем и альтернатив.
0

Будет ли это работать? Просто предложение, я не супер горячий с потоками. Сохраняйте класс, обрабатывающий загрузку, будет ли это работать?

    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");
            }
        }
0

Вместо вызова thread.Abort() вы можете использовать поток рабочего фона и использовать встроенное событие отмены.

Вы вызываете worker.CancelAsync(), чтобы поднять событие. Это может быть нажатие кнопки или клавиши, например.

Затем в методе worker_DoWork у вас есть следующее:

if (worker.CancellationPending)
{
    // close the stream
}
else
{
    // Carry on downloading
}

внутри вашего цикла, выполняющего загрузку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню