Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (来自HRESULT的异常:0x8001010E(RPC_E_错误_线程))_C#_Xml_Windows 8 - Fatal编程技术网

C# (来自HRESULT的异常:0x8001010E(RPC_E_错误_线程))

C# (来自HRESULT的异常:0x8001010E(RPC_E_错误_线程)),c#,xml,windows-8,C#,Xml,Windows 8,我试图将一个ObservableCollection与一个ListBox相关联,但是我得到了以下错误:应用程序调用了一个为不同线程封送的接口。(来自HRESULT的异常:0x8001010E(RPC\u E\u错误的\u线程)) 在课堂上,我有: public ObservableCollection<WidgetCollectionItem> WidgetsDownloaded(string e) { int alertas = 0;

我试图将一个ObservableCollection与一个ListBox相关联,但是我得到了以下错误:应用程序调用了一个为不同线程封送的接口。(
来自HRESULT的异常:0x8001010E(RPC\u E\u错误的\u线程)

在课堂上,我有:

  public ObservableCollection<WidgetCollectionItem> WidgetsDownloaded(string e)
    {
        int alertas = 0;

        XDocument document = XDocument.Parse(e);

        // Obtener el id
        //id = document.Root.Element("id").Value;

        ObservableCollection<WidgetCollectionItem> Items = new ObservableCollection<WidgetCollectionItem>();
        foreach (XElement wid in document.Root.Elements("widget"))
        {
            WidgetCollectionItem widget = new WidgetCollectionItem();
            widget.captionWid = wid.Attribute("caption") != null ? wid.Attribute("caption").Value : null;

            ObservableCollection<ServiciosWidgetCollectionItem> ItemsSer = new ObservableCollection<ServiciosWidgetCollectionItem>();
            widget.ItemsSer = ItemsSer;

            foreach (XElement service in wid.Elements("service"))
            {
                ServiciosWidgetCollectionItem ser = new ServiciosWidgetCollectionItem();

                ser.captionWid = wid.Attribute("caption") != null ? wid.Attribute("caption").Value : null;
                ser.nameWid = wid.Attribute("name") != null ? wid.Attribute("name").Value : null;
                ser.nameSer = service.Attribute("name") != null ? service.Attribute("name").Value : null;
                ser.captionSer = service.Attribute("caption") != null ? service.Attribute("caption").Value : null;
                ser.descripcion = service.Attribute("desc") != null ? service.Attribute("desc").Value : null;
                ser.valor = service.Element("xvalue") != null ? service.Element("xvalue").Value : null;
                ser.color = service.Element("xcolor") != null ? service.Element("xcolor").Value : null;
                ser.alerta = service.Element("xalert") != null ? service.Element("xalert").Value : null;
                if (ser.alerta != null) { alertas++; }

                ItemsSer.Add(ser);
            }
            Items.Add(widget);
        }
        return Items;
    }




 public class ServiciosWidgetCollectionItem
    {
        public string captionWid { get; set; }
        public string captionSer { get; set; }
        public string nameWid { get; set; }
        public string nameSer { get; set; }
        public string descripcion { get; set; }
        public string valor { get; set; }
        public string color { get; set; }
        public string alerta { get; set; }
    }

    public class WidgetCollectionItem
    {
        public string captionWid { get; set; }
        public ObservableCollection<ServiciosWidgetCollectionItem> ItemsSer { get; set; }
    }

widgetsList.ItemsSource
仅允许从用于创建控件的线程访问。这通常是UI线程。在MSDN上,您可以了解到它启动了一个异步请求,因此您的委托在另一个线程上被调用。在原始线程(UI线程)中分配响应,就可以了

编辑:有关如何实现此目的的示例,请参阅。注意:在启动时将dispatcher保存在一个静态变量中,以使您的生活更轻松

public MainPage()
    {
        this.InitializeComponent();

        Prueba prueba = new Prueba();

        var request = (HttpWebRequest)WebRequest.Create(new Uri(ruta));
        request.BeginGetResponse(r =>
        {
            var httpRequest = (HttpWebRequest)r.AsyncState;
            var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);

            using (var reader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var response = reader.ReadToEnd();

                widgetsList.ItemsSource = prueba.WidgetsDownloaded(response);
            }
        }, request);
    }