无法从其他线程添加列表项
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 是一个更好的答案。以上是关于无法从其他线程添加列表项的主要内容,如果未能解决你的问题,请参考以下文章