M
M
Millerish2017-01-06 23:11:54
C++ / C#
Millerish, 2017-01-06 23:11:54

C#: why is IsBackground not working?

Good evening!
I am learning C#. Tell me why the thread does not become asynchronous after IsBackground (the window just hangs while the button is moving)? How right?

public delegate void HelperToColl();
    public partial class Form1 : Form
    {
        HelperToColl HTC;
        Random rnd = new Random();
        public Form1()
        {
            InitializeComponent();
            HTC = new HelperToColl(car_1_race);
        }

        private void Start_btn_Click(object sender, EventArgs e)
        {
            Thread car_1 = new Thread(car_1_race);
            car_1.IsBackground = true;
            Invoke(HTC);
        }
        public  void car_1_race()
        {
            while (true)
            {
                Thread.Sleep(100);
                Car_1_btn.Left += rnd.Next(1, 3);
            }
        }
    }

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
skosterin88, 2017-01-07
@skosterin88

Here you need to look towards the Task Parallel Library + using the async-await construct. I made the car_1_race procedure itself asynchronous and used a Task object instead of a Thread object. The program, I’ll say right away, will slow down, but the form will respond to requests.
Here is my implementation:

public delegate void HelperToColl();
    public partial class Form1 : Form
    {
        HelperToColl HTC;

        Random rnd = new Random();
        public Form1()
        {
            InitializeComponent();
            HTC = new HelperToColl(car_1_race);
        }

        
        private void Start_btn_Click(object sender, EventArgs e)
        {
            //Избавляемся от объекта Thread, он нам здесь не нужен. 
            //Всю асинхронность прячем внутрь вызываемой процедуры.
            //Здесь только обращение к процедуре.
            Invoke(HTC);
        }

        //Здесь надо обратить внимание на слово async. 
        //Тем самым мы объявляем процедуру асинхронной.
        public async void car_1_race()
        {
            while (true)
            {
                //Task.Delay(N).Wait() - если я правильно понимаю, это аналог Thread.Sleep(N)
                //Я уменьшил со 100 до 50, чтобы не так тормозило.
                Task.Delay(50).Wait();
                //Получаем значение смещения как результат асинхронного выполнения процедуры, 
                //возвращающей случайное число; () => {...} - это и есть та самая процедура.
                int left = await Task.Factory.StartNew<int>(() => {return rnd.Next(1, 3);});
                //Смещаем нашу кнопку
                Car_1_btn.Left += left;
            }
        }
               

    }

PS And yes, still not Coll, but Call.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question