Закрытие потока в потоке, который уже запущен [C #] - PullRequest
2 голосов
/ 15 января 2010

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

Ответы [ 6 ]

6 голосов
/ 15 января 2010
stream.Close();
4 голосов
/ 15 января 2010

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

1 голос
/ 15 января 2010

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

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

0 голосов
/ 16 января 2010

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

    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 голосов
/ 16 января 2010

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

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

Тогда в методе worker_DoWork вы получите следующее:

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

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

0 голосов
/ 16 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...