【问题标题】:How to implement a logging window in C#?如何在 C# 中实现日志记录窗口?
【发布时间】:2019-04-27 16:57:06
【问题描述】:

所以使用 windows 表单生成器,我创建了一个带有文本框的新表单,将此表单称为 LogForm.cs,此表单/类有一个名为 log(string text) 的方法。

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

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

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

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

【问题讨论】:

标签: c# .net windows


【解决方案1】:

LogForm.log 中使用/调用此函数(顺便说一句,C# 中的方法通常大写)。

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

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

如果不能从当前线程设置,yourTextBox.InvokeRequired 将为真,该函数将解决它。否则它只是直接设置它。

灵感来自this answerpossible duplicate

既然你说问题仍然存在,我将展示更多代码并尝试进一步解释。

首先,我编辑了SetText 方法。我添加了 private 修饰符,因为此函数不打算在LogForm 之外的任何地方调用。我还添加了大括号,因为这是我的首选样式,它还确保 if 语句的行为符合预期。

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

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

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

【讨论】:

  • 我已经按照你说的做了,但还是不行,它会冻结应用程序并使其崩溃。
  • 你会考虑展示更多你的代码吗?我用一个普通的 windows 窗体测试了这个片段,并从 UI 线程调用了一次该方法,然后从一个完全独立的线程调用了一次。它两次都有效。
  • 检查我的编辑是否有帮助。如果不是,请编辑您的问题并添加您对未按预期工作的日志功能的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2020-12-07
  • 2023-03-11
  • 2012-11-09
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
相关资源
最近更新 更多