0

RSSを読み込んでラベルに出力するアプリを作ったのですが、ループさせたいのでTimerを使っています。スレッドが終了したらすぐに、3 分待ってから再起動します。スレッド/タイマーが行うことは、タイトル用と説明用の 2 つのラベルを持つパネルを作成し、その中に rss アイテムの値を入れます。

タイマーは必要なことを行いますが、コントロールは応答しなくなります。

ところで。カスタムコントロールを使用しています。

4

1 に答える 1

1

(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()

明らかに、これはまさにあなたが探しているものではありませんが、あなたにとって十分な手がかりになるかもしれません. その拡張メソッドは、フォーム タイプ以外にも機能します。

于 2012-07-27T20:23:12.980 に答える