[英]UWP ObservableCollection (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
[英](Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
我嘗試將ObservableCollection與ListBox關聯,但是我收到以下錯誤:應用程序調用了一個為不同線程編組的接口。 ( Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)
)
Prueba.cs在課堂上,我有:
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; }
}
並從MainPage建立到頁面的連接,整個過程工作正常,但當我插入ListBox ItemsSouces給我錯誤:
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);
}
僅允許從用於創建控件的線程訪問widgetsList.ItemsSource
。 這通常是UI線程。 在MSDN上,您可以閱讀有關它啟動異步請求的BeginGetResponse ,因此您的委托在另一個線程上被調用。 在原始線程(UI線程)中分配響應,你沒事。
編輯:請參閱WinRT中的UI線程上的運行代碼,以獲取如何實現此目的的示例。 注意:在啟動時將調度程序保存在靜態變量中,以使您的生活更輕松。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.