D
D
Denis Mashanov2016-11-22 04:21:03
C++ / C#
Denis Mashanov, 2016-11-22 04:21:03

Why are the old values ​​stored in the stream?

Please help, why are the old values ​​saved in the BackgroundWorker thread?

BackgroundWorker bw = new BackgroundWorker();
private void button2_Click(object sender, EventArgs e) // запуск таймера класс BackgroundWorker
        {
            key = true;
            int i = 0;
            Text = "Таймер. Время: " + i;
            Timer time = new Timer();
            bw.DoWork += (o, eo) => // событие потока (событие работает до того момента пока не завершится действие)
            {
                for (;key;)
                {
                    Invoke(new Action(() => // делегат позволяет получить безопасный доступ к элементам главного потока, то есть из потока в котором был запущен поток
                    {
                        i = time.Time(i);
                        Text = "Таймер. Время: " + i;
                    }));
                    Thread.Sleep(1000);
                }
            };
            bw.RunWorkerAsync(); // старт потока
        }
private void button3_Click(object sender, EventArgs e)
        {
            if (bw != null) // если поток запущен
            {
                key = false;
                bw.WorkerSupportsCancellation = true; // при завершении события DoWork WorkerSupportsCancellation устанавливается true, это нужно для того, чтобы завершить поток. Но так как DoWork не завершён, то мы принудительно указываем true
                bw.CancelAsync(); // уничтожение потока
            }
        }
public class Timer // типо таймер
    {
        public int Time(int i)
        {
            i++;
            return i;
        }
    }

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexander Kuznetsov, 2016-11-22
@LoneRay

I made some small changes:

bool key;
Timer time; /*вынес класс*/
volatile int i; /*вынес i и пометил как volotile, но если у вас Intel и один поток, то это не обязательно*/

BackgroundWorker bw = new BackgroundWorker();
private void button2_Click(object sender, EventArgs e) // запуск таймера класс BackgroundWorker
{

My text changed - Timer. Time: 1, Timer. Time: 2 etc.
Question, what processor do you have?
Is the example code provided a simplified version? If yes, have you checked it?
Do you have only one thread changing the value of the variable i?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question