2016-03-03 117 views
0

我需要的元素添加到其他線程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(); 
     } 
    } 

的問題是,調用什麼也不做,不甚至會引發異常。

我以前曾經使用過這種代表,而且從未遇到過問題。現在有什麼不同?

+0

你試過聲明你的方法是虛擬的 – Roy

回答

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