Member 13199106 Ответов: 2

Возникли проблемы с потоковой передачей списка и текстового поля.


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

[код]

   public void GrabInfo()
        {

            regionTB.Text = geoRegion(bo2IpListBox.FocusedItem.SubItems[1].Text);
            cityTB.Text = geoCity(bo2IpListBox.FocusedItem.SubItems[1].Text);
            zipTB.Text = geoZIP(bo2IpListBox.FocusedItem.SubItems[1].Text);
            ispTB.Text = geoISP(bo2IpListBox.FocusedItem.SubItems[1].Text);
        }
        private void bo2IpListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (connected)//basic bool to make it connected before anything happens
            {
                try
                {
                    progressPanel3.Visible = true;
                    new Thread(() => this.GrabInfo()) { IsBackground = true }.Start();
                    progressPanel3.Visible = false;

                }
                catch { }
            }
        }

[/code]

The error I'm getting 
http://i.imgur.com/NPmYOC3.png

What I have tried:

I tried using a Invoke how i could never get that took work as well.

Graeme_Grant

"Я пробовал использовать вызов, как я никогда не мог получить, что также требовало работы."

Просто перепроверил свой код, и он отлично работает. Пожалуйста, проверьте, правильно ли вы его реализовали.

2 Ответов

Рейтинг:
4

Member 13199106

К сожалению, с этим кодом инструмент перестает отвечать на запросы, но я очень ценю вашу помощь. Спасибо.

Редактировать это действительно сработало, просто заняло в два раза больше времени, что странно.


Рейтинг:
0

Graeme_Grant

"Ошибка работы кросс-потока" возникает при попытке обновить объекты в потоке пользовательского интерфейса из другого потока. Чтобы разрешить проблему, вам нужно вызвать ее в потоке пользовательского интерфейса:

// you can define a delegate with the signature you want
public delegate void UpdateControlsDelegate();

public void GrabInfo()
{
    //this method is executed by the background worker
    InvokeUpdateControls();
}

public void InvokeUpdateControls()
{
    if (this.InvokeRequired)
    {
        this.Invoke(new UpdateControlsDelegate(UpdateControls));
    }
    else
    {
        UpdateControls();
    }
}

private void UpdateControls()
{
    // update your controls here
    regionTB.Text = geoRegion(bo2IpListBox.FocusedItem.SubItems[1].Text);
    cityTB.Text = geoCity(bo2IpListBox.FocusedItem.SubItems[1].Text);
    zipTB.Text = geoZIP(bo2IpListBox.FocusedItem.SubItems[1].Text);
    ispTB.Text = geoISP(bo2IpListBox.FocusedItem.SubItems[1].Text);
}