如何在C#中实现日志记录窗口?

时间:2019-04-27 16:57:07

标签: c# .net windows

因此,使用Windows窗体构建器,我创建了一个带有文本框的新窗体,将该窗体称为LogForm.cs,此窗体/类具有一个称为log(string text)的方法。

在主窗体类(Form1.cs)中,我创建了该窗体的实例。

LogForm logForm = new LogForm();
logForm.log("Logger has started...");

,它在LogForm文本框中显示正常。但是,当我在线程内的代码上调用logForm.log("Some logging info...")时,它会使我的应用程序崩溃。

我该如何处理?请帮我演示一小段代码。我对C#和整个编程还很陌生,希望您考虑一下。

1 个答案:

答案 0 :(得分:0)

LogForm.log中使用/调用此函数(C#中的btw方法通常为大写)。

private void SetText(string text)
{
    Action set = () => yourTextBox.Text = text;

    if (yourTextBox.InvokeRequired)
    {
        yourTextBox.Invoke(set);
    }
    else
    {
        set.Invoke();
    }
}

如果无法从当前线程yourTextBox.InvokeRequired进行设置,则为true,函数将对其进行处理。否则,直接设置即可。

来自this answerpossible duplicate的启发。

由于您说的是问题仍然存在,所以我将显示更多代码,然后尝试进一步说明。

首先,我编辑了SetText方法。我添加了private修饰符,因为此功能并非要在LogForm之外的任何地方调用。我还添加了大括号,因为这是我的首选样式,并且还可以确保if语句的行为符合预期。

public void Log(string message) {
    SetText(message);
    //do stuff
}

这两种方法(LogSetText)都放在LogForm类中。现在,只要您的表单(包含文本框)已经初始化,就可以从任何线程调用logForm.Log("Logger has started...");。这通常在构造函数中通过在第一行调用InitializeComponent();来实现。

在不进一步了解您的代码的情况下,这可能是我可以为您提供的最大帮助。