Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 02:39   #1
Lastsummer
Пользователь
 
Аватар для Lastsummer
 
Регистрация: 05.10.2010
Сообщений: 10
Печаль C# BackgroundWorker - завершение работы потока

Здравствуйте! Очень надеюсь на Вашу помощь...
Начала изучать потоки в C#, работаю с BackgroundWorker. Написала первую пробную программу, которая выводит в случайном порядке числа в заданном диапазоне. По нажатию кнопки пуск поток запускается, а по нажатию стоп должен останавливаться. Вся проблема в том, что я не могу его остановить... Перепробовала все, на что наткнулась, но поскольку в этом деле новичок, правильно ничего так и не вышло сделать...
Помогите пожалуйста, спасибо!

Код:
namespace CSharp_Threads
{
    public partial class Thread_Form : Form
    {
        //объявляем переменную типа BackgroundWorker
        BackgroundWorker bw1;

        public Thread_Form()
        {
            InitializeComponent();

            //создаем экземпляр класса BackgroundWorker
            bw1 = new BackgroundWorker();
            //объект BackgroundWorker поддерживает обновление сведений о ходе выполнения
            bw1.WorkerReportsProgress = true;
            bw1.WorkerSupportsCancellation = true;

            //описание непосредственно работы потока
            bw1.DoWork += delegate(object sender, DoWorkEventArgs e)
            {
                    while (true)
                    {
                        System.Threading.Thread.Sleep(150);
                        bw1.ReportProgress(0);
                    }
            };

                //вывод результатов работы на экран
                bw1.ProgressChanged += delegate(object sender, ProgressChangedEventArgs e)
                {
                    int res = chanse(9);
                    label1.Text = res.ToString();
                };

                //обработчик события по завершению работы потока
                bw1.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e)
                {
                    if (e.Cancelled == true)
                    {
                        resultLabel.Text = "Canceled!";
                    }
                    else if (e.Error != null)
                    {
                        resultLabel.Text = "Error: " + e.Error.Message;
                    }
                    else
                    {
                        resultLabel.Text = "Done!";
                    }
                };
        }


        //обработчик события запуска потоков
        private void Start_Btn_Click(object sender, EventArgs e)
        {
            bw1.RunWorkerAsync();
            startBtn.Enabled = false;
        }

        //обработчик события остановки потоков
        private void stopBtn_Click(object sender, EventArgs e)
        {
            if (bw1.WorkerSupportsCancellation == true)
               bw1.CancelAsync();

        }

        //функция, генерирующая случайное число
        private int chanse(int n)
        {
            int result;
            Random rand = new Random();

            result = rand.Next(n);
            return result;
        }

    }
}
Lastsummer вне форума Ответить с цитированием
Старый 16.03.2011, 04:04   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
while (true)
не, не, ну кто ж так делает. Вот как надо:

Цитата:
To add support for cancellation:
1. Set the WorkerSupportsCancellation property to true.
2. Periodically check the CancellationPending property from within the DoWork
event handler. If it’s true, set the event argument’s Cancel property to true, and
return. (The worker can also set Cancel and exit without CancellationPending
being true if it decides that the job is too difficult and it can’t go on.)
3. Call CancelAsync to request cancellation.
Т.е. типа такого:

PHP код:
while (!CancellationPending) { ... }
e.Cancel true
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 16.03.2011 в 04:09.
veniside вне форума Ответить с цитированием
Старый 16.03.2011, 18:04   #3
Lastsummer
Пользователь
 
Аватар для Lastsummer
 
Регистрация: 05.10.2010
Сообщений: 10
По умолчанию

Спасибо за ответ, он меня развеселил и очень помог - теперь все работает. Спасибо!
Lastsummer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
завершение работы файла grafgrial Общие вопросы Delphi 8 15.08.2010 20:33
Как отследить завершение выполнения потока TThread? Трик Общие вопросы Delphi 3 24.10.2007 14:55
Завершение работы чужой программы Viteef Win Api 12 24.09.2007 12:31
завершение работы оператора If Noor Общие вопросы C/C++ 1 14.03.2007 10:07