Возвращаясь большое количество значений из потока


У меня есть приложение, в котором я постоянно запрашивая XML-веб-службы каждые 2 секунды в потоке. Возвращаемый XML очень большой и я получение много вещей от них с помощью XPath и вставляю значения в ярлыки в GUI, используя делегаты для потокобезопасности.

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

public void GetConditions(object activeDs)
    {
        string ds = (string)activeDs;            
        XPathDocument doc;
        XmlNamespaceManager ns;
        XPathNavigator navigator;
        XPathNodeIterator nodes;
        XPathNavigator node;
        Thread unitThread = new Thread(new ParameterizedThreadStart(SetUnits));
        unitThread.Start(ds);
        while (contFlag)
        {
            try
            {
                doc = new XPathDocument(ds + "/current");
                navigator = doc.CreateNavigator();
                navigator.MoveToFirstChild();
                string uri = navigator.LookupNamespace("");
                ns = new XmlNamespaceManager(navigator.NameTable);
                ns.AddNamespace("m", uri);

                string devName = xmlParser.GetXmlValues(ns, "//m:Devm", "name", navigator);
                tsa.SetText(devName, currDevName);

                string execStatus = xmlParser.GetXmlValues(ns, "//m:Exec", navigator);
                SetExecutionStatus(execStatus);

                string spndlSpd = xmlParser.GetXmlValues(ns, "//m:Spieed", "subType", "ACTUAL", navigator);
                double spndlSpdDbl; double.TryParse(spndlSpd, out spndlSpdDbl);                                          
                tsa.SetText(spndlSpdDbl.ToString("0.000"), spndSpdLbl);

                string spndlSpdOvr = xmlParser.GetXmlValues(ns, "//m:Spieed", "subType", "OVERRIDE", navigator);
                double spndlSpdOvrDbl; double.TryParse(spndlSpdOvr, out spndlSpdOvrDbl);                      
                tsa.SetText(spndlSpdOvrDbl.ToString("0.000"), spndSpOrLbl);

                string feedRt = xmlParser.GetXmlValues(ns, "//m:Parate", "subType", "ACTUAL", navigator);
                double feedRtDbl; double.TryParse(feedRt, out feedRtDbl);                    
                tsa.SetText(feedRtDbl.ToString("0.000"), feedLbl);

                string feedRtOvr = xmlParser.GetXmlValues(ns, "//m:Paedrate", "subType", "OVERRIDE", navigator);
                double feedRtOvrDbl; double.TryParse(feedRtOvr, out feedRtOvrDbl);                     
                tsa.SetText(feedRtOvrDbl.ToString("0.000"), fdOrLbl);

                string modeTxt = xmlParser.GetXmlValues(ns, "//m:ControllerMode", navigator);
                tsa.SetText(modeTxt, modeLbl);

                string progTxt = xmlParser.GetXmlValues(ns, "//m:Program", "name", "program", navigator);
                tsa.SetText(progTxt, prgNameLbl);

                string prtCntFrmStrm = xmlParser.GetXmlValues(ns, "//m:PartCount", navigator);
                SetPartCount(prtCntFrmStrm);

                BuildAlertList();
                nodes = navigator.Select("//m:ComponentStream", ns);
                int i = 1;
                try
                {
                    while (nodes.MoveNext())
                    {
                        node = nodes.Current;
                        string currComp = node.GetAttribute("component", ns.DefaultNamespace);
                        string currCompName = node.GetAttribute("name", ns.DefaultNamespace);
                        if (node.HasChildren)
                        {                                
                            XPathNodeIterator xn = node.SelectChildren(XPathNodeType.Element);
                            while (xn.MoveNext())
                            {
                                if (xn.Current.Name == "Condition")
                                {
                                    XPathNodeIterator xpni = xn.Current.SelectChildren(XPathNodeType.Element);
                                    while (xpni.MoveNext())
                                    {
                                        XPathNavigator xpn1 = xpni.Current;
                                        string currAlrtType = xpn1.GetAttribute("type", ns.DefaultNamespace);
                                        string currAlrt = xpn1.Name;
                                        string[] addToList = new String[3] { currComp, currAlrtType, currAlrt };
                                        ListViewItem ls = new ListViewItem(addToList);
                                        tsa.AccessControlList(ls, condView);
                                    }
                                }
                            }
                        }
                        i++; 
                    }
                }
                catch { }
                Thread.Sleep(2000);                    
            }
            catch (WebException ex)
            {
                MessageBox.Show("Cannot retrieve stream. Please check Data source.","Demo App");
                xmlParser.AppState = 0;
                Console.Write(ex.ToString());
                break;
            }
        }
    }

Мое главное ограничение заключается в том, что мне нужно, чтобы извлечь все эти данные и вставьте его в GUI. Любой указатели будут полезны для меня.



1283
5
задан 11 августа 2011 в 04:08 Источник Поделиться
Комментарии
2 ответа

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

Я бы порвала всех тех анализа и АСП.Помощью setText вещи в отдельные методы (предполагая, что ваш объект XML-парсер-это уровень переменной):

SetCurrentDevName();
SetExecutionStatus(); // this can do the string parsing on it's own from the member level xmlParser
SetSpndlGibberishAmbiguouslyNamedThing(); // spndlSpd is not a descriptive name for anything
SetSpndlSpdOvrDbl();
SetFeedRateDouble(); // I think that's what fdrtdbl is? Who knows
SetFeedRateOverDouble();
SetModeText();
SetProgText();
SetPartCount();

Далее, вы должны попробовать заблокировать без улова или, наконец, после того, это не служит никакой цели, если я что-то упускаю..

Наконец, вся ваша вложенная в то время как блок один отдельный способ.

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

Редактировать:
и как уже упоминалось ранее, использовать LINQ и XDocuments, намного проще, чем старый объект XmlDocument/xpathnavigator с вещами.

5
ответ дан 12 августа 2011 в 01:08 Источник Поделиться

Одно небольшое изменение вы можете сделать:

new Thread(new ParameterizedThreadStart(SetUnits)); 

может быть записан как

new Thread(SetUnits);

3
ответ дан 11 августа 2011 в 11:08 Источник Поделиться