此委托不起作用
问题描述:
我需要的元素添加到其他线程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();
}
你试过声明你的方法是虚拟的 – Roy