无法从其他线程添加列表项

Posted

技术标签:

【中文标题】无法从其他线程添加列表项【英文标题】:List item can't be added from a different thread 【发布时间】:2021-12-16 14:12:36 【问题描述】:

我正在使用 c# 练习网络,到目前为止一切都很好 我有一个客户端/服务应用程序的情况,我试图发送和接收消息 并将消息添加到服务器应用程序的 ListBox 中。 但是从客户端发送消息后,它向我显示一个错误(跨线程操作无效),我无法将消息从另一个线程添加到列表中 这是代码:

 public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private void Form1_Load(object sender, EventArgs e)
    
        Thread serverListen = new Thread(bufferHandlerThread);
        serverListen.Start();
    
    private void bufferHandlerThread()
    
        UdpClient server = new UdpClient(6661);
        while (true)
        
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            byte[] buffer = server.Receive(ref RemoteIpEndPoint);
            string receivedData = Encoding.UTF8.GetString(buffer);
            string toAdd = RemoteIpEndPoint.Address.ToString() + " <-> " + receivedData;
            dataList.Items.Add(toAdd); // Here the exception.
        
    

谢谢你:)

【问题讨论】:

可以添加dataList定义吗? 搜索这个错误,这上面有一百万个帖子 除非有令人信服的理由,否则您不应直接使用 Thread 对象,而应使用 Task 对象。 列表 for 到底是什么? 但是为什么 - 你打算用那个列表做什么 【参考方案1】:

替换这个:

dataList.Items.Add(toAdd);

与:

Invoke(new Action(() =>

    dataList.Items.Add(toAdd);
));

【讨论】:

感谢兄弟的帮助,但它说“无法将 lambda 表达式转换为类型'Delegate',因为它不是委托类型”CS1660【参考方案2】:

您可以使用以下方法。

public static void AddListItemThreadSafe<TControl>(this TControl @this, Action action)  where TControl : ListBox

    if (@this.InvokeRequired)
    
        @this.Invoke((MethodInvoker)delegate
        
            dataList.Items.Add(toAdd);

            action(); 
        );
    
    else
    
        action();
    

【讨论】:

虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码答案没有用处。 谢谢你的回答兄弟,我同意你@AbhishekDutt ..如果你能给我推荐一些关于c#的好书,我真的很感激。 这确实有效,我很感激 @C0pp3r - 对于您的特定问题,这是一个糟糕的解决方案。这是一个对半答案。 @C0pp3r - Redneck 是一个更好的答案。

以上是关于无法从其他线程添加列表项的主要内容,如果未能解决你的问题,请参考以下文章

无法将与当前打开页面匹配的活动类添加到菜单列表项

从其他片段添加新的 RecyclerView 项

使用 jquery 从数组列表中添加和删除数组项

将列表框项添加到 SQL Server 列作为列名

添加多个组件时反应重复的列表项?

如何在 listcontrol 列标题中添加一个复选框以选中和取消选中列表项的所有复选框?