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

问题描述 投票:0回答:1

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

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

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

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

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

c# .net windows
1个回答
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方法。我添加了私有修饰符,因为这个函数没有在LogForm之外的任何地方被调用。我还添加了大括号,因为这是我的首选样式,它还确保if语句按预期运行。

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

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

在不了解您的代码的情况下,这可能是我可以帮助您的。

© www.soinside.com 2019 - 2024. All rights reserved.