none
Treeview background добавить ветки RRS feed

  • Вопрос

  • Всем привет. Написал код, который сканирует диапозон айпи адресов, после чего ищет в них очередь сообщений майкрософт, и вес результат показывает. Код работал, но понадобилась чтоб этот код работал в другом потоке, чтоб приложение на время не виснула. Переделал код:

    void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                //try
                {
                    treeView1.Nodes.Clear();
                    //Application.DoEvents();
     
                    IPAddress _ipfrom = IPAddress.Parse(ipfrom.Text);
                    IPAddress _ipTo = IPAddress.Parse(ipTo.Text);
                    IPAddress ipScan = null;
     
                    string hostname = null;
     
                    int[] aa = new int[4], bb = new int[4];
     
                    aa[0] = Convert.ToInt32(_ipfrom.GetAddressBytes()[0]);
                    aa[1] = Convert.ToInt32(_ipfrom.GetAddressBytes()[1]);
                    aa[2] = Convert.ToInt32(_ipfrom.GetAddressBytes()[2]);
                    aa[3] = Convert.ToInt32(_ipfrom.GetAddressBytes()[3]);
     
                    bb[0] = Convert.ToInt32(_ipTo.GetAddressBytes()[0]);
                    bb[1] = Convert.ToInt32(_ipTo.GetAddressBytes()[1]);
                    bb[2] = Convert.ToInt32(_ipTo.GetAddressBytes()[2]);
                    bb[3] = Convert.ToInt32(_ipTo.GetAddressBytes()[3]);
     
                    Ping pingSender = new Ping();
                    PingOptions options = new PingOptions();
                    options.DontFragment = true;
                    string data = "aaaa";
                    byte[] bufer = Encoding.ASCII.GetBytes(data);
                    int timeout = 50;
                    toolStrip1.Invoke((MethodInvoker)delegate { toolStripProgressBar1.Minimum = aa[3]; });
                    toolStrip1.Invoke((MethodInvoker)delegate { toolStripProgressBar1.Maximum = bb[3]; });
                   
                    
     
                    for (int d = aa[3]; d <= bb[3]; d++)
                    {
                        ipScan = IPAddress.Parse(aa[0].ToString() + "." + aa[1].ToString() + "." + aa[2].ToString() + "." + d.ToString());
     
                        toolStrip1.Invoke((MethodInvoker) delegate { toolStripProgressBar1.Value = d;});
                        PingReply reply = pingSender.Send(ipScan, timeout, bufer, options);
     
     
     
                        
     
                        if (reply.Status == IPStatus.Success)
                        {
                           
     
     
                            hostname = GetHostName(ipScan);
                           
     
                            //----------------------------
                            treeView1.Invoke((MethodInvoker)delegate { treeView1.Nodes.Add(hostname); });
     
     
     
                        }
     
                        /*else
                        {
                            treeView1.Invoke((MethodInvoker)delegate { treeView1.Nodes.Add(ipScan.ToString() + "  false"); });
                        }*/
                        
     
                    }
     
                    
                    TreeNodeCollection nodes = treeView1.Nodes;
     
                   
                     
                    foreach (TreeNode n in nodes)
                    {
                        
                     
                            MessageQueueChildNode(n);
     
                        
                    }
     
     
                }
                catch
                {
     
                }
            }

    public void MessageQueueChildNode(TreeNode tn)
            {
                
                TreeNode thisnode;
     
                
                try
                {
                    ConnectionOptions connection = new ConnectionOptions();
                    connection.Username = "login";
                    connection.Password = "password";
                    connection.Authority = "ntlmdomain:domain.com";
     
                    
                   
                            thisnode = tn;
                            string con = String.Format("\\\\{0}\\root\\CIMV2", tn.Text );
     
                            ManagementScope manage = new ManagementScope(con, connection);
     
                            manage.Connect();
     
                            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_msmq_MSMQQueue");
     
                            ManagementObjectSearcher searcher =
                                new ManagementObjectSearcher(manage, query);
     
                           
     
                                foreach (ManagementObject queryObj in searcher.Get())
                                {
                                    
                                    thisnode.Nodes.Add(queryObj["Name"].ToString());
                                    
                                    
     
     
                                }
                            
                        
                   
     
                }
     
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                
            }

    первая часть кода работает, список машин добавляет в treeview, но вторая часть (MessageQueueChildNode), та которая отвечает за очередь сообщений не работает. Что посоветуйте?

    10 февраля 2014 г. 18:43

Ответы

  • Вот этот код из backgroundWorker1_DoWork работает в потоке, отличном от интерфейсного:

    TreeNodeCollection nodes = treeView1.Nodes;
                     
    foreach (TreeNode n in nodes)
    {
        MessageQueueChildNode(n);
    }

    Закомментируйте временно try и catch, отладчик должен среагировать на это.

    11 февраля 2014 г. 13:50

Все ответы

  • С элементами управления ни в коем случае нельзя взаимодействовать из другого потока. Ваш код не всегда следует этому правилу. Запуск приложения без отладки "глотает" такие исключения. Запустите отладку и все увидете.
    10 февраля 2014 г. 18:56
  • С элементами управления ни в коем случае нельзя взаимодействовать из другого потока. Ваш код не всегда следует этому правилу. Запуск приложения без отладки "глотает" такие исключения. Запустите отладку и все увидете.
    я запускал с отладкой, но никаких ошибок не показало
    11 февраля 2014 г. 13:39
  • Вот этот код из backgroundWorker1_DoWork работает в потоке, отличном от интерфейсного:

    TreeNodeCollection nodes = treeView1.Nodes;
                     
    foreach (TreeNode n in nodes)
    {
        MessageQueueChildNode(n);
    }

    Закомментируйте временно try и catch, отладчик должен среагировать на это.

    11 февраля 2014 г. 13:50