Здесь нужно смотреть в сторону 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.