Изучаю 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);
}
}
}
Код у тебя странный... Ты пуляешь в отдельный поток метод, но НЕ запускаешь и вместо этого вызываешь делегат 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.
Вам не нужна многопоточность в вашем коде, поскольку изменение свойств контролов всё равно должно производиться в главном потоке.
Воспользуйтесь лучше современным 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);
}
}
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости