[C # windows form] При вызове списка в потоке другие элементы управления не работают - PullRequest
1 голос
/ 15 августа 2010

Я новичок в C #, надеюсь, мое описание проблемы читабельно. Вот моя проблема, я разрабатываю приложение для мобильного телефона win6.5. Приложение должно иметь некоторые элементы памяти, один из которых «сканировать», при нажатии на него оно многократно сканирует точки доступа Wi-Fi поблизости и отображает их в виде списка. Поэтому я создаю поток с циклом while для сканирования каждые 10 секунд, я также использую listview.invoke, чтобы сделать просмотр списка доступным в потоке. При нажатии «scan» все выглядит хорошо, однако другие пункты меню не могут быть выбраны из-за запуска потока while. Я застрял здесь на несколько дней, большое спасибо, ребята, помогите ~

private void menuItemScan_Click(object sender, EventArgs e)
        {
            ...

            Thread t = new Thread(new ThreadStart(ScanThread));
            t.Start();
        }

        private void ScanThread()
        {

            listView1.Invoke(new APScanCallback(APScan));

        }

        public void APScan() 
        {
            while (true)
            {

                listView1.Items.Clear();
                foreach (AccessPoint ap in wzcInterface.NearbyAccessPoints)
                {
                    ListViewItem item = new ListViewItem(ap.Name);
                    item.SubItems.Add(ap.PhysicalAddress.ToString());
                    item.SubItems.Add(ap.SignalStrength.Decibels.ToString());
                    item.SubItems.Add(ap.AuthenticationMode.ToString());
                    listView1.Items.Add(item);
                }
                listView1.Refresh();
                Thread.Sleep(10000);
            }

        }

Ответы [ 2 ]

3 голосов
/ 15 августа 2010

Control.Invoke "ставит в очередь" выполнение метода в пользовательском интерфейсе обработки потока (для того, чтобы сериализовать эти стандартные вызовы в другие стандартные вызовы пользовательского интерфейса).

Даже если вы запускаете поток, который вызывает Control.Invoke, подпрограмма APSScan выполняется в потоке, который вызвал Application.Run ... и я вижу, что APSScan никогда не возвращается, вызывая остановку потока пользовательского интерфейса.

Решение состоит в том, чтобы вызывать Control.Invoke несколько раз, повторяя цикл в ScanThread.

Используя ваш код:

private void ScanThread()
    {

        while (true) {
            listView1.Invoke(new APScanCallback(APScan));
            Thread.Sleep(10000);
        }
    }

    public void APScan() 
    {
            listView1.Items.Clear();
            foreach (AccessPoint ap in wzcInterface.NearbyAccessPoints)
            {
                ListViewItem item = new ListViewItem(ap.Name);
                item.SubItems.Add(ap.PhysicalAddress.ToString());
                item.SubItems.Add(ap.SignalStrength.Decibels.ToString());
                item.SubItems.Add(ap.AuthenticationMode.ToString());
                listView1.Items.Add(item);
            }
            listView1.Refresh();
     }
0 голосов
/ 15 августа 2010

Ваш код фактически выполняется в главном потоке.

listView1.Invoke (new APScanCallback (APScan));

Этот код отправляет выполнение APScan в основной поток приложения.Просто используйте таймер в рабочем потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...