문제

사용한 스레드에서 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.Controls.Add(li); 

평소를 진술하는 선

Control.invoke는 별도의 스레드에서 생성 된 컨트롤과 상호 작용하는 데 사용해야합니다.

아무도 문제를 발견 할 수 있습니까? 다른 스레드에서 Access Control에 호출을 사용하는 것은 내가 전에 여러 번 해본 것입니다.

티아

한 번의 기회

도움이 되었습니까?

해결책

문제가 Invoke에 대한 제어를 전달하는 것 같습니다 (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