-1

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

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

所以本质上,在一个表单上创建的线程需要访问另一个表单上动态创建的表单元素。

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

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

在此先感谢所有帮助都热切期待(现在咬指甲)并非常感谢。

编辑

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

    ctThread.start()

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

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

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

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 的第一行运行并且没有返回到流程面板。因此,当它转到下一行时,它不能使用空作为参考。因此出现上述错误。

4

1 回答 1

1

两件事情。

  1. 您必须知道的最重要的事情是您不能直接从后台线程访问控件的属性。控件只能从前台 UI 线程进行操作。为了从后台线程访问控件,您需要使用某种形式的异步编程,例如在 .NET 1.x - 3.5 中创建委托或使用新的Task<T>andasyncawait关键字。

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

更新:

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

此外,请查看 MSDN 文档(这是在 .NET 2.0 中引入的,并在 .NET 4.5 中被and关键字BacgkroundWorker所取代)。有很多可用的文档可以准确地解释如何做你所要求的。在 MSDN 或 Bing(或您的首选搜索引擎)上执行快速搜索并不难找到。asyncawaitTask<T>

于 2013-07-31T13:10:43.073 回答