Millerish
@Millerish

C#: почему IsBackground не работает?

Добрый вечер!

Изучаю C#. Подскажите, почему поток не становиться асинхронным после IsBackground (окно просто подвисает пока едет кнопка)? Как правильно?

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);
            }
        }
    }
  • Вопрос задан
  • 524 просмотра
Пригласить эксперта
Ответы на вопрос 1
@skosterin88
Здесь нужно смотреть в сторону Task Parallel Library + использования конструкции async-await. Я сделал асинхронной саму процедуру car_1_race и вместо объекта Thread использовал объект Task. Программа, сразу скажу, будет подтормаживать, но форма на запросы реагировать будет.
Вот моя реализация:
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;
            }
        }
               

    }

P.S. И да, все же не Coll, а Call.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы