C#WM6 Compact Frameworkクロススレッド通信の問題
-
06-07-2019 - |
質問
UIを使用して作成されたスレッドから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であるため、コントロールをパネルに追加します。 / p>
私の問題は、コントロールとpanel1.InvokeRequiredに対してfalseを呼び出した後でも、エラーが表示されることです
panel1.Controls.Add(li);
通常の内容を示す行
Control.Invokeは、別のスレッドで作成されたコントロールと対話するために使用する必要があります。
誰でも問題を見つけることができますか?呼び出しを使用して別のスレッドのコントロールにアクセスすることは、以前に何度も行ったことですが、これには困惑しています!
TIA
ワンショット
解決
問題は、invokeでコントロールを渡すことであったようです(ListItemは私が作成したフォームコントロールです)。
addControlToPanel()
method、iを呼び出した後、メソッド内にコントロールを作成するために必要なすべての情報を渡します
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);
}
}
乾杯
ワンショット
所属していません StackOverflow