我需要从其他线程向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();
}
}
问题是Invoke什么都不做,甚至没有抛出异常。
我之前使用过这种代表,从来没有遇到过问题。现在有什么不同?
答案 0 :(得分:0)
您的代码可以根据需要使用下面的测试代码,因此问题应该是其他问题。
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();
}