我已经制作了一个用于读取 RSS 并将其输出到标签的应用程序,但我使用的是一个计时器,因为我想循环它。我希望我的线程完成后,等待 3 分钟,然后重新启动它。线程/计时器的作用是制作一个带有 2 个标签的面板,一个用于标题,一个用于描述,我在其中放置了 rss 项目的值。
计时器可以满足我的需要,但控件变得无响应。
顺便提一句。我正在使用自定义控件。
我已经制作了一个用于读取 RSS 并将其输出到标签的应用程序,但我使用的是一个计时器,因为我想循环它。我希望我的线程完成后,等待 3 分钟,然后重新启动它。线程/计时器的作用是制作一个带有 2 个标签的面板,一个用于标题,一个用于描述,我在其中放置了 rss 项目的值。
计时器可以满足我的需要,但控件变得无响应。
顺便提一句。我正在使用自定义控件。
(假设 4.0)首先,在你的项目的一个模块中制作这个扩展方法。这将处理跨线程 UI 操作。
<Extension()> _
Public Sub SomeCrossThreadAction(Of T As ISynchronizeInvoke)(ByRef objTarget As T, ByVal actCrossThreadAction As Action(Of T))
If objTarget.InvokeRequired Then
objTarget.Invoke(actCrossThreadAction, New Object() {objTarget})
Else
actCrossThreadAction(objTarget)
End If
End Sub
其次,定义将由您的线程调用的方法,该方法利用扩展方法向表单添加控件。这是一个示例(在这种情况下,我是表单。如果您希望传递一个表单参数(或其他类型)来替换“我”,则可以向此方法添加一个表单参数):
Private Sub ThreadsWork()
Dim lblTest As New Label
lblTest.Text = "Some Text."
Me.SomeCrossThreadAction(Sub(frm As Form) frm.Controls.Add(lblTest))
End Sub
在您的 Timer Elapsed 事件处理程序中:
Dim t As New Threading.Thread(Sub(x) ThreadsWork())
t.Start()
显然,这并不完全是您正在寻找的内容,但对您来说可能已经足够了。该扩展方法不仅适用于表单类型。