Как синхронизировать работу потока и основной программы, чтобы они не мешали друг другу?

141
07 августа 2021, 12:20

После нажатия кнопки поток отключает доступ к программе, я не могу даже выйти из программы.Что мне делать. в listView1 должны пробежаться строки a, b, c, d и при этом я должен делать что либо с с основной формой. Например набирать текст в textbox. Как синхронизировать работу потока и основной программы, чтобы они не мешали друг другу.

private void Button1_Click(object sender, EventArgs e)
{
    Thread childThread = new Thread(getlistAsync);
    childThread.Start();
}
private void getlistAsync()
{
    while (true)
    {
        add("a", "b", "c", "d");
    }
}
public async Task add(string prob, string reg, string data, string user)
{
    String[] row = { prob, reg, data, user };
    ListViewItem item = new ListViewItem(row);
    this.listView1.BeginInvoke(
    new Action(() =>
    {
        listView1.Items.Add(item);
        listView1.Refresh();
    }));
}
private void Form1_Shown(object sender, EventArgs e)
{
    listView1.Columns.Add("Problems", 80);
    listView1.Columns.Add("Data", 120);
    listView1.Columns.Add("Registry Key", 130);
    listView1.Columns.Add("users", 80);
}
Answer 1

От того, что вы убрали в отдельный поток заполнение контрола, никакой пользы не будет, т.к. ваш бесконечный цикл будет постоянно дергать UI-поток, чтобы обновить отображение контрола, что собственно и приводит к ожидаемому зависанию, да еще и накладным расходам на межпоточное взаимодействие.

Можете провести эксперимент и убедиться в этом, добавив в ваш цикл, который бежит в отдельном потоке Thread.Sleep(1000).

Не знаю какую реальную задачу вы пытаетесь решить таким способом, но в отдельный поток стоит стоит выносить операции, которые выполняются долго и не дергают UI-постоянно.

Answer 2

Из того, что я вижу - это WinForms, а там все трудозатратные задачи требуется выполнять в фоновом потоке, BackgroundWorker. Обратите внимание на эту статью

READ ALSO
Классы и дефолтная инициализация

Классы и дефолтная инициализация

В C# в структурах запрещено использовать конструктор без параметров, так как он используется для инициализации членов структуры (обнуления...

420
netcore 2.2 подключить стороннюю библиотеку на NetFramework 4.5.2

netcore 2.2 подключить стороннюю библиотеку на NetFramework 4.5.2

Для проекта на netcore 22 понадобилось использовать библиотеку скомпилированную под X86 NetFramework 4

152
Woocommerce Storefront. Добавить несколько цен в товар

Woocommerce Storefront. Добавить несколько цен в товар

В товаре предусмотрено 3 цены, в зависимости от размераВозле каждой цены кнопка "в корзину"

98