草庐IT

c# - (来自 HRESULT : 0x8001010E (RPC_E_WRONG_THREAD)) 的异常

coder 2024-07-01 原文

我尝试将 ObservableCollection 关联到 ListBox,但出现以下错误:应用程序调用了一个为不同线程编码的接口(interface)。 (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 的信息它启动一个异步请求,所以你的委托(delegate)在不同的线程上被调用。在原始线程(UI 线程)中分配响应就可以了。

编辑:参见Run code on UI thread in WinRT例如如何实现这一目标。注意:将启动时的调度程序保存在静态变量中,让您的生活更轻松。

关于c# - (来自 HRESULT : 0x8001010E (RPC_E_WRONG_THREAD)) 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15943682/

有关c# - (来自 HRESULT : 0x8001010E (RPC_E_WRONG_THREAD)) 的异常的更多相关文章

  1. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  6. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  7. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  8. c# - 先学什么? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion几年前我去学校学习编程,毕业后我找到了一份系统管理方面的工作,这就是我职业生涯的方向。我想重新开始某种开发,并且一直在“玩”C#和ASP.NET,但我已经听到很多关于其他"new"语言的讨论(新的意思是它们是新的)我)喜欢Ruby和F#。我想我想知道我是否在浪费时间学习主要的MS语言,而不是成为一名通才。很长一段时间没有离开开发社区(如果我曾经离开过的话)让我在潮流中挣扎,我不想落在时代的

  9. c# - 在 C# 中重现 Ruby OpenSSL private_encrypt 输出 - 2

    我有一个简单的Ruby脚本,我用它在某些HTTPheader上执行private_encrypt以签署要发送到ruby​​RESTAPI的Web请求,该API会根据Base64编码字符串测试Base64编码字符串生成而不是解码Base64和解密数据然后测试原始字符串。我使用的脚本是require"openssl"require"base64"path_to_cert=ARGV[0].dupplain_text=Base64.decode64(ARGV[1].dup)private_key=OpenSSL::PKey::RSA.new(File.read(path_to_cert))pu

  10. ruby-on-rails - 类型错误 : wrong argument type String (expected Module) - 2

    我有以下代码:classProfileLookup基本上包含大量查找数据,按类别拆分。目的是为数据库中的每个类别创建一个方法。通过Rails控制台,此代码按预期工作:ruby-1.9.3@hub:002>ProfileLookup.available_gendersProfileLookupLoad(0.6ms)SELECT"profile_lookups".*FROM"profile_lookups"WHERE"profile_lookups"."category"='gender'ORDERBYvalue=>["Female","Male"]但是,我的规范不合格。以下规范:requ

随机推荐