用于应用程序多线程日志构建跨表单实例的C#最佳实践

时间:2019-01-10 11:53:47

标签: c# multithreading logging readerwriterlockslim

我正在构建一个UI,该UI包含一个主Form,以及其他表单和自定义类的可能实例。我仍然缺少的是一种一致的记录错误的方法。所以我要做的是围绕所有可能产生错误的代码创建try-catch块,主要是处理传入数据的事情。我从某个站点接收到恒定的数据流(JSON),因此该框架的内置线程功能使其成为多线程应用程序。再说一次,多线程部分是内置功能,从C#的角度来看,我还不那么聪明,因为我还不那么聪明。 ;)

对于日志记录部分,我从here中获得了以下代码。即使我还不那么聪明,但我确实认为我确实了解那里发生了什么。但是,我的关注/问题是:如何实现将错误写入一个日志文件跨表单跨类的多线程日志记录机制。

以下是您可以使用参考的示例:

// MyMainForm.cs
namespace MyNameSpace
{
    public partial class MyMainForm : Form
    {
        FooClass MyClass = new FooClass();  //<< errors could occur here
        Form f = new MyForm();              //<< errors could occur here

        ...                                 //<< errors could occur here
    }
}

// FooClass.cs
namespace MyNameSpace
{
    public class FooClass
    {
        public string ErrorGeneratingMethod() 
        {
            try...catch(Exception e) { /* Write to Log file */ }
        }
    }
}

// Don't really know where to put this...
private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim();

public void WriteToFileThreadSafe(string text, string context)
{
    string t = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture);
    string path = Properties.Settings.Default.FQLogFileLocation;

    // Set Status to Locked
    _readWriteLock.EnterWriteLock();
    try
    {
        // Append text to the file
        using (StreamWriter sw = File.AppendText(path))
        {
            sw.WriteLine("[" + t + "]["+ context + "]" + text);
            sw.Close();
        }
    } catch (Exception e)
    {
        MessageBox.Show(e.Message); // Really Exceptional (should never happen)
    }
    finally
    {
        // Release lock
        _readWriteLock.ExitWriteLock();
    }
}

因此,对我来说重要的是,我应该将WriteToFileThreadSafe()和_readWriteLock放在哪里? 以及如何安全地在具有多个形式和类的多个线程中使用此函数?

非常感谢您让我向您的老师学习:)

0 个答案:

没有答案