此委托不起作用
本文关键字:不起作用 | 更新日期: 2023-09-27 18:37:16
我需要从其他线程向 Winform ListView 控件添加一个元素,所以我使用委托,这样:
private delegate void AddMessageLogCallback(string message);
public void AddMessageLog(string message)
{
if (InvokeRequired)
Invoke(new AddMessageLogCallback(AddMessageLog), message);
else
{
lstLogs.Items.Add(message).EnsureVisible();
}
}
问题是调用不执行任何操作,甚至不会引发异常。
我以前使用过这种委托,从来没有遇到过问题。此时有什么不同?
您的代码与下面的测试代码一起按预期工作,因此问题应该是其他问题。
private void button1_Click(object sender, EventArgs e)
{
AddMessageLog("local message");
}
private async void button2_Click(object sender, EventArgs e)
{
await Task.Run(() => AddMessageLog("async message"));
}
顺便说一句,我要提一下,没有必要定义一个新的AddMessageLogCallback
代表并递归地调用AddMessageLog
。所以一个更简单(也许更干净)的解决方案:
public void AddMessageLog(string message)
{
Action addLog = () => lstLogs.Items.Add(message).EnsureVisible();
if (InvokeRequired)
Invoke(addLog);
else
addLog();
}