2017-05-02 69 views
4

我想從我的類中添加一個「日誌」消息到ListBox的窗體上添加到日誌窗口。在表單中,我只能使用lblog.add("message"),但由於我正在清理我的代碼,因此將「消息」傳遞到前端的最佳方式是什麼?最好的辦法,從項目一類

我發現,有下面的代碼的建議,但不知道是否有一個更簡單的方法?

形式:

// This is all required so that we can call the function from another class 
public void publicLogMessage(string message) 
{ 
    if (InvokeRequired) 
    { 
     Invoke(new OutputDelegate(logMessage), message); 
    } 
} 

public delegate void OutputDelegate(string message); 

public void logMessage(string message) 
{ 
    lblog.Items.Add(DateTime.Now + " " + message); 
} 

類:

//This is required so that we can call the "PublicLogMessage" function on the main form 
public frmMain formToOutput; 

public speechRecognition(frmMain f) 
{ 
    formToOutput = f; 
} 

用法:

formToOutput.logMessage 
+0

WPF或winforms? –

+0

的WinForms抱歉。 –

回答

0

使用if/else使用InvokeRequired的時候,我不認爲有此刻的其他優化。

public void publicLogMessage(string message) 
{ 
    if (InvokeRequired) 
     Invoke(new OutputDelegate(logMessage), message); 
    else 
     logMessage(message); 
} 

public delegate void OutputDelegate(string message); 
private void logMessage(string message) 
{ 
    lblog.Items.Add(DateTime.Now + " " + message); 
} 
1

現在,您的算法和輸出方法之間的耦合非常緊密。你的算法知道所有你的輸出方式(例如,它是具有特定簽名的形式)。

我建議脫鉤它:

private readonly Action<string> log;  

public speechRecognition(Action<string> log) 
{ 
    this.log = log; 
} 

public void DoWork() 
{ 
    this.log("work started"); 

    // ... 

    this.log("work in progress"); 

    // ... 

    this.log("work ended"); 
} 

該類一無所知測井方法。它只知道它獲得了一個字符串。類同時控制輸出方法(形式)和算法(上文類)可以然後將它們連結在一起,

var form = new YourFormWithLoggingWindow(); 

var algorithm = new speechRecognition(form.publicLogMessage); 

現在該算法將登錄到該表。您可以使用

並且它將在控制檯應用程序中登錄到控制檯。該算法不關心,也不需要你的表單來編譯。它是獨立的。你的表單也不知道算法。它也是獨立的。

你甚至可以有檢查記錄單元測試:

var log = new List<string>(); 
var algorithm = new speechRecognition(log.Add); 

algorithm.DoWork(); 

Assert.AreEqual(log.Count, 3); 
0
private void listboxlrm(byte[] text) 
{ 
    if (this.listBox2.InvokeRequired) 
    { 
     SetTextCallback d = new SetTextCallback(listboxlrm); 
     this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
     byte[] convert = new byte[text[4]]; 
     Array.Copy(text, 6, convert, 0, text[4]); 
     string yourtext = System.Text.Encoding.UTF8.GetString(convert); 
     this.listBox2.Items.Insert(0, string.Format(yourtext)); 
    } 
} 

我使用的方法....如果你使用插入隨時添加頂部。