0

を使用して作成されたスレッドから UI のコントロールを更新する際に問題が発生しています

ThreadPool.QueueUserWorkItem

このスレッド内で私が呼んでいる

addControlToPanel(li);

ここに示すように

private delegate void addControlToPanelDelegate(ListItem li);
private void addControlToPanel(ListItem li)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        panel1.Invoke(d, new object[] { li });
    }
    else
    {
        panel1.Controls.Add(li);
    }
}

addControlToPanel() panel1.InvokeRequired == true への最初のエントリで、デリゲートがインスタンス化されてから呼び出されます。今度は、この addControlToPanel() へのエントリで、 panel1.InvokeRequired == false で、コントロールをパネルに追加します。

私の問題は、コントロールと panel1.InvokeRequired が false に対して呼び出した後でも、エラーが発生することです

panel1.Controls.Add(li); 

通常の行

別のスレッドで作成されたコントロールと対話するには、Control.Invoke を使用する必要があります。

誰でも問題を見つけることができますか? インボークを使用して別のスレッドのコントロールにアクセスすることは、これまで何度も行ってきたことですが、これには困惑しました!

ティア

ワンショット

4

1 に答える 1

1

問題は呼び出し時にコントロールを渡していたようです (ListItem は私が作成したフォーム コントロールです) 代わりに、コントロールを作成してに渡すのではなく、コードをリファクタリングしました。

addControlToPanel()

メソッドを呼び出した後、メソッド内でコントロールを作成するために必要なすべての情報を渡します。

private delegate void addControlToPanelDelegate(string picname, string thumburl, PicasaEntry entry, Int32 top, EventHandler clickevent);
private void addControlToPanel(string picname, string thumburl, PicasaEntry entry, Int32 Ordinal,EventHandler clickevent)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        this.Invoke(d, new object[] { picname, thumburl, entry, Ordinal, clickevent });
        //panel1.Invoke(d, new object[] { li });
    }
    else
    {
        ListItem li = new ListItem(picname, thumburl, entry);
        li.Top = Ordinal * li.Height;
        li.Click += clickevent;
        panel1.Controls.Add( li);
    }
}

乾杯

ワンショット

于 2009-06-19T13:43:34.447 に答える