如下:lbxLog是一个用来显示信息的listbox,下面的委托和方法也是定义在主线程。但是在主线程中调用和在其他线程中调用,居然互不影响:主线程中调用后Items.Count能增加,但是其他线程中调用,却是另外的一个Items.Count值,两个线程都是自己加自己的。其中主线程增加的Item 可以显示出来,其他线程的却不能显示。
public delegate void ListBoxCallback(string str);
public void SetListBox(string str)
{
try
{
if (lbxLog.InvokeRequired == true)
{
ListBoxCallback d = new ListBoxCallback(SetListBox);
lbxLog.Invoke(d, str);
}
else
{
this.lbxLog.Items.Insert(lbxItemCount, str);
lbxItemCount++;
}
}
catch(Exception ex)
{
log.Error("屏幕信息显示出错:", ex);
}
}
怎样才能让所有线程调用后增加的Item全显示出来?
没写对,你只了解了一半的跨线程访问控件的方式,你应该把整个的ListBox都包装进去,类似下面这样:
private delegate void AppendTextDelegate(string text, RichTextBox textBox);
public void AppendText(string text, RichTextBox textBox)
{
if (!textBox.InvokeRequired)
{
if (textBox.Lines.Length == 10000)
textBox.Clear();
textBox.AppendText(text);
textBox.ScrollToCaret();
}
else
{
AppendTextDelegate append = new AppendTextDelegate(this.AppendText);
textBox.Invoke(append, new object[] { text, textBox });
}
}
我来回答,
一,建立委托
delegate void ListBoxCallback(string str);
ListBoxCallback ListBoxCallbackPro= null;
二,定义方法,
public void SetListBox(string str)
{
try
{
if (lbxLog.InvokeRequired == true)
{
lbxLog.Invoke(ListBoxCallbackPro, str);
}
else
{
this.lbxLog.Items.Insert(lbxItemCount, str);
lbxItemCount++;
}
}
catch(Exception ex)
{
log.Error("屏幕信息显示出错:", ex);
}
}
说明:以上代码我在本人及其上测试成功,
你的代码出错应该是在:定义委托实例那,不应该定义成局部变量,最好放在类里面!
delegate void ListBoxDelegate(string str); /// <summary>在listbox中追加信息<</summary> /// <param name="str">要追加的信息</param> public void AddItemToListBox(string str) { try { if (listbox.InvokeRequired) { ListBoxDelegate d = AddItemToListBox; listbox.Invoke(d, str); }
ListBoxDelegate d = AddItemToListBox;
listbox.Invoke(d, str); 是函数AddItemToListBox()的语句,为什么要反复调用自己?非常感谢 ,我是新手,能不能帮忙看一下