此委托不起作用

本文关键字:不起作用 | 更新日期: 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();
}