【问题标题】:windows application Logging mechanismwindows应用程序日志机制
【发布时间】:2014-01-23 23:39:06
【问题描述】:

我正在开发一个 Windows 应用程序。我在主窗体中显示日志信息。我想添加另一个类的日志信息。下面是按钮点击事件的代码:

private void button1_Click(object sender, EventArgs e)
    {
        IDAL dal = new LoadCaseDAL();
        Result result = new Result();
        dal.Load(result);
        AddToLogger("test end");
    }

AddtoLogger(){ }

AddtoLogger() 和按钮点击事件在主窗体中。

在 dal.Load(result) 方法中,我正在调用此函数。我想使用 AddToLogger() 方法将此函数中的日志信息添加到主窗体中。

protected internal void LoadLCFiles(BoltDataset.LoadCaseDataTable dt)
    {
        List<string> files = Helper.GetFiles("Text Files|*.txt");

        **//AddToLogger("Total files: " + files.Count().ToString());**

        Task loadFilesTask = Task.Factory.StartNew(() =>
        {
            foreach (string filePath in files)
            {
                LoadLCTextFile(filePath, dt);
            }
        }).ContinueWith(t =>
        {
            if (t.IsFaulted)
            {

                **//AddToLogger("Loading Failed");**
            }
            else if (t.IsCompleted)
            {                    
                **//AddToLogger("Loading Succesfull");**
            }
        });
    }

我怎样才能做到这一点?请建议。

【问题讨论】:

  • 把这个传入 dal.Load(this, result);并使 AddtoLogger 公开.. 现在您可以从您的 dal 类中调用 AddtoLogger ...但是,对于日志记录,我会使用类似 log4net 的东西
  • dal 不是一种形式。它是一个数据访问层的类

标签: c# winforms task-parallel-library


【解决方案1】:

您可以将日志记录功能放在静态类中。这样它就可以在您的代码中的任何地方使用,并且不需要对象来执行它。

public static class Tools 
{
    public static void AddToLogger(string msg) { ... }
}

现在构建一个委托,您每次添加消息时都会在 AddToLogger() 中调用它:

  // Delegate for new log entries
  public delegate void LogEntryAddedDelegate(string message);
  public static LogEntryAddedDelegate LogEntryAdded { get; set; }

然后在您的AddToLogger() 函数中调用它。所以你的静态类应该看起来像这样:

public static class Tools
{
    // Delegate for new log entries
    public delegate void LogEntryAddedDelegate(string message);
    public static LogEntryAddedDelegate LogEntryAdded { get; set; }

    public static void AddToLogger(string msg)
    {
        // Do some stuff here

        // Call the event
        LogEntryAdded(msg);
    }
}

然后你可以像这样在你的表单中挂钩你的事件:

// Registers your function to get called when a new log message is added
Tools.LogEntryAdded += new Tools.LogEntryAddedDelegate(NewLogAdded);

protected void NewLogAdded(string msg)
{
    // Update your textbox
}

然后你可以像这样添加新的日志消息:

Tools.AddToLogger("msg");

这样,您的函数 NewLogAdded() 会在您每次向日志中添加新消息时被调用。


您可能还想看看日志框架。它们使记录内容变得更加容易,您不必自己编写代码。

一个好的.Net 日志库是log4net

【讨论】:

  • 但问题依然存在。我的问题是我无法访问显示日志信息的表单控件。
  • @ManishGupta 用关于如何实现这一目标的教程更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2021-05-24
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多