Почему IsBackground не работает?

411
09 января 2017, 20:02

Изучаю 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);
        }
    }
}
Answer 1

Код у тебя странный... Ты пуляешь в отдельный поток метод, но НЕ запускаешь и вместо этого вызываешь делегат HTC.

Должно быть как-то вот так(Я набросал свой пример работы):

  private void button1_Click(object sender, EventArgs e)
    {
        var thread=new Thread(WriteTxt);
        thread.Start();
    }

 private void WriteTxt()
    {
        while (true)
        {
            if (!richTextBox1.InvokeRequired)//Если обращаешься к UI из того же потока
            {
                richTextBox1.AppendText("1\n");
            }
            else
            {
                Invoke(new Action<string>(richTextBox1.AppendText),"1\n");//Иначе делаем Invoke.
            }
            Thread.Sleep(1000);
        }
    }

И на заметку:

Потоки- это низкоуровневая штуку, сейчас более актуальны Task.

Answer 2

Вам не нужна многопоточность в вашем коде, поскольку изменение свойств контролов всё равно должно производиться в главном потоке.

Воспользуйтесь лучше современным async/await:

public partial class Form1 : Form
{
    Random rnd = new Random();
    public Form1()
    {
        InitializeComponent();
    }
    private void Start_btn_Click(object sender, EventArgs e)
    {
        RandomCarMovement();
    }
    private async Task RandomCarMovement()
    {
        while (true)
        {
            await Task.Delay(100);
            Car_1_btn.Left += rnd.Next(1, 3);
        }
    }
}
READ ALSO
C# Вывод данных sqlite в datagridview без datasource

C# Вывод данных sqlite в datagridview без datasource

Подскажите, как вывести данные из sqlite в datagridview таким образом, чтобы привязать "DATE" и "FULLNAME" к конкретным столбцам datagridviewВариант с datasource не устраивает,...

635
Selenium. Получение Cookie с сайта

Selenium. Получение Cookie с сайта

Я хотел бы узнать как с помощью Selenium получить Cookie, c браузера по умолчаниюТо есть пользователь авторизуется на моем сайте, а потом скачивает...

341
Исчезли элементы формы

Исчезли элементы формы

C#, Visual Studio 2013В одной из форм проекта неожиданно исчезли ВСЕ ее элементы: кнопки, диаграмма, textBox - ВСЕ

316
Обновление окна WPF

Обновление окна WPF

Начал разбираться в WPF, и сразу столкнулся с такой проблемой: в коде есть переменная, которую я постоянно меняюОна отображается в форме в Label

592