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

时间:2013-07-31 10:46:35

标签: vb.net multithreading dynamically-generated

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

  1. 我在screen1加载时启动一个线程。然后用户转到screen2。
  2. 在屏幕2上,线程仍在后面运行。当用户在screen2上执行操作(例如点击)时,它将触发线程访问screen2上的元素
  3. 屏幕2中的元素是动态创建的,不是在IDE中设计的。
  4. 因此,在一个表单上创建的线程本质上需要访问另一个表单上动态创建的表单元素。

    如果我的问题太简单,请原谅我。如果不清楚请告诉我,我会改写它。

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

    提前致谢 所有的帮助都是热切的(现在咬指甲)等待并非常感激。

    修改

    1. 让我们说一个名为ctThread的线程已在仪表板屏幕中启动

      ctThread.start()

    2. 此线程无休止地运行,等待触发事件。

    3. 同时用户已进入名为QuizScreen的屏幕,在此屏幕(表格)上我必须更新一些我知道名字的动态创建的元素。

    4. 因此,当正在等待的ctThread时间(听众线程)时,它将调用下面的子。

    5. 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
      

      此处节点不断变化。这就是我区分我创建的每个控件的方式。

      注意:此线程在名为dashboardscreen的屏幕中启动,用户现在位于不同的屏幕QuizScreen上。

      我在上面给出的sub的第一行运行并且没有返回到flowpanel。因此,当它进入下一行时,它无法使用任何内容作为参考。因此上面提到的错误。

1 个答案:

答案 0 :(得分:1)

两件事。

  1. 您必须知道的最重要的事情是您无法从后台线程直接访问控件的属性。控件只能从前台UI线程进行操作。为了从后台线程访问控件,您需要使用某种形式的异步编程,例如使用新的Task<T>async以及await关键字创建代表a la .NET 1.x - 3.5。

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

  3. 更新:

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

    另外,请查看BacgkroundWorker上的MSDN文档(这是在.NET 2.0中引入的,并且被asyncawait个关键字以及Task<T>取代.NET 4.5)。有很多文档可以准确地解释如何做你要问的事情。通过在MSDN或Bing(或您首选的搜索引擎)上执行快速搜索并不难找到。