首页 新闻 会员 周边 捐助

关于委托,调用的奇怪问题

0
悬赏园豆:30 [已解决问题] 解决于 2009-11-04 16:32

如下: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全显示出来?

博客群龙的主页 博客群龙 | 初学一级 | 园豆:140
提问于:2009-11-04 11:11
< >
分享
最佳答案
0

没写对,你只了解了一半的跨线程访问控件的方式,你应该把整个的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 });
}
}

注意线程安全,可以用lock把count++ 保护起来,更简单的方式,则是使用
Interlocked.Increment(ref int location)
收获园豆:20
Launcher | 高人七级 |园豆:45050 | 2009-11-04 11:45
多谢,受益匪浅
博客群龙 | 园豆:140 (初学一级) | 2009-11-04 16:29
其他回答(1)
0

我来回答,

一,建立委托

     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);
            }
        }

 

说明:以上代码我在本人及其上测试成功,

 你的代码出错应该是在:定义委托实例那,不应该定义成局部变量,最好放在类里面!

  

收获园豆:10
会游泳dě鱼 | 园豆:250 (菜鸟二级) | 2009-11-04 11:46
谢谢,受到启发
支持(0) 反对(0) 博客群龙 | 园豆:140 (初学一级) | 2009-11-04 16:29
 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()的语句,为什么要反复调用自己?非常感谢 ,我是新手,能不能帮忙看一下

支持(0) 反对(0) 嗯啊 | 园豆:81 (初学一级) | 2014-10-15 19:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册