从vb.net中的线程访问动态创建的表单元素

从vb.net中的线程访问动态创建的表单元素,vb.net,multithreading,dynamically-generated,Vb.net,Multithreading,Dynamically Generated,我是VB和.Net新手,我有一个无法继续的任务 当screen1加载时,我启动一个线程。然后用户进入屏幕2 在屏幕2上,线程仍在后面运行。当用户在screen2上执行操作(比如单击)时,它将触发线程访问screen2上的元素 屏幕2中的元素是动态创建的,而不是在IDE中设计的 因此,本质上,在一个窗体上创建的线程需要访问在另一个窗体上动态创建的窗体元素 如果我的问题太简单,请原谅我。如果不清楚,请让我知道,我会重新措辞 注意:我所说的元素基本上是流布局面板中的一个图片框 提前谢谢 所有的帮助都被

我是VB和.Net新手,我有一个无法继续的任务

  • 当screen1加载时,我启动一个线程。然后用户进入屏幕2
  • 在屏幕2上,线程仍在后面运行。当用户在screen2上执行操作(比如单击)时,它将触发线程访问screen2上的元素
  • 屏幕2中的元素是动态创建的,而不是在IDE中设计的 因此,本质上,在一个窗体上创建的线程需要访问在另一个窗体上动态创建的窗体元素

    如果我的问题太简单,请原谅我。如果不清楚,请让我知道,我会重新措辞

    注意:我所说的元素基本上是流布局面板中的一个图片框

    提前谢谢 所有的帮助都被热切地等待着(现在正在咬钉子),并且非常感谢

    编辑

  • 假设在仪表板屏幕中启动了一个名为ctThread的线程

    ctThread.start()

  • 该线程无休止地运行,等待触发事件

  • 同时,用户进入了一个名为QuizScreen的屏幕,在这个屏幕(表单)上,我必须更新一些动态创建的元素,我知道这些元素的名称

  • 因此,当等待的ctThread(侦听器线程)时机成熟时,它将调用下面的子线程

  • 潜艇

    这里节点不断变化。这就是我如何区分我创建的每个控件

    注意:此线程是在一个名为dashboardscreen的屏幕上启动的,用户现在位于另一个屏幕QuizScreen上

    我在上面给出的sub的第一行运行并没有返回任何内容到flowpanel。因此,当它转到下一行时,它不能使用nothing作为引用。因此出现了上述错误。

    两件事

  • 您必须知道的最重要的一点是,您不能从后台线程直接访问控件的属性。控件只能从前台UI线程进行操作。为了从后台线程访问控件,您需要使用某种形式的异步编程,例如创建la.NET 1.x-3.5委托,或者使用新的
    任务
    异步
    等待
    关键字

  • 您是否将动态创建的控件添加到表单的控件集合中?请注意,您仍然需要通过委托或其他一些异步方法访问控件,如上面1中所述

  • 更新:

    回答OP评论中的问题:您还可以
    调用UI对象上的方法。基本上,您告诉.NET运行被调用的方法,它在UI对象的创建线程(在本例中为UI线程)上运行,这就是您想要的。这将允许您(取决于调用的方法或属性)从后台“更新”控件-同样,这都是花招;当调用UI对象上的方法时,invkoked方法可能使用从后台任务传递到所述方法的数据在UI线程上运行


    此外,请查看
    BacgkroundWorker
    上的MSDN文档(该文档在.NET 2.0中引入,并被.NET 4.5中的
    async
    wait
    关键字以及
    任务所取代)。有很多可用的文档可以准确地解释如何执行您的请求。在MSDN或Bing(或您喜欢的搜索引擎)上快速搜索并不难找到。

    这项任务的哪一部分您遇到了问题?你有没有试过,但效果不好?还是你有错误?或者你只是在征求关于如何着手做类似事情的一般建议?嗨,史蒂文,谢谢你的回复。尝试访问动态创建的元素时出错。错误是“对象引用未设置为对象的实例”。如果我尝试使用表单上的事件访问相同的元素(动态元素),我就能够做到这一点。但是在线程中尝试相同的代码时。由于某种原因,它找不到元素。我是一名web开发人员(php/python),基本上陷入了一个vb.net项目中。应用程序开发对我来说是相当新的。它可能和线程无关,但不可能用这么少的细节来说明。如果你能发布一个复制问题的简化代码示例,那将非常有帮助。你能帮我整理一下吗。再次感谢。亲爱的@fourpastmidnight我很久没看到这个了。因为我换了一个不同的任务,我离开了这个。现在我回到原来的任务。因此,首先感谢您的回复。但是午夜四点我用了代理,但它仍然不起作用。
    public sub changeComputerStatus(ByVal node)
        Dim flowpanel As FlowLayoutPanel = CType(QuizScreen.FlowLayoutPanel1.Controls("flow_" + node), FlowLayoutPanel)
        Dim pictControl As PictureBox = CType(flowpanel.Controls("pict_" + node), PictureBox)
        pictControl.Image = System.Drawing.Image.FromFile(Application.StartupPath & "\images\application-on.png")
    end sub