我在使用

创建的线程更新我的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与在单独线程上创建的控件进行交互。

有人能发现问题吗?使用调用访问另一个线程上的控件是我以前做过很多次但是这个让我难过!

TIA

单稳

有帮助吗?

解决方案

似乎问题是在调用上传递一个控件(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);
    }
}

干杯

单稳

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top