这个代表不起作用

时间:2016-03-03 01:44:09

标签: c# winforms listview delegates

我需要从其他线程向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什么都不做,甚至没有抛出异常。

我之前使用过这种代表,从来没有遇到过问题。现在有什么不同?

1 个答案:

答案 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();
}