RSSを読み込んでラベルに出力するアプリを作ったのですが、ループさせたいのでTimerを使っています。スレッドが終了したらすぐに、3 分待ってから再起動します。スレッド/タイマーが行うことは、タイトル用と説明用の 2 つのラベルを持つパネルを作成し、その中に rss アイテムの値を入れます。
タイマーは必要なことを行いますが、コントロールは応答しなくなります。
ところで。カスタムコントロールを使用しています。
RSSを読み込んでラベルに出力するアプリを作ったのですが、ループさせたいのでTimerを使っています。スレッドが終了したらすぐに、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
次に、Extension Method を利用してフォームにコントロールを追加するスレッドによって呼び出されるメソッドを定義します。以下に例を示します (この場合の Me はフォームです。"Me" を置き換えるためにフォーム パラメータ (または他の型) をこのメソッドに追加することができます)。
Private Sub ThreadsWork()
Dim lblTest As New Label
lblTest.Text = "Some Text."
Me.SomeCrossThreadAction(Sub(frm As Form) frm.Controls.Add(lblTest))
End Sub
タイマー経過イベント ハンドラーで:
Dim t As New Threading.Thread(Sub(x) ThreadsWork())
t.Start()
明らかに、これはまさにあなたが探しているものではありませんが、あなたにとって十分な手がかりになるかもしれません. その拡張メソッドは、フォーム タイプ以外にも機能します。