0

我正在构建一个 UI,该 UI 由一个主表单以及其他表单和自定义类的可能实例组成。我仍然缺少的是记录错误的一致方式。所以我所做的是围绕所有可能产生错误的代码创建 try-catch 块,主要是处理传入数据的东西。我从某个站点接收恒定数据流 (JSON),因此框架的内置线程功能使其成为多线程应用程序。同样,多线程部分是内置功能,我自己并没有积极地这样做,因为从 C# 的角度来看,我还没有那么聪明。;)

对于日志记录部分,我从这里得到了下面的代码。尽管我还没有那么聪明,但我确实认为我确实了解那里发生的事情。然而,我的关注/问题是:我如何实现一种多线程日志记录机制,将错误写入一个日志文件跨表单跨类。

这是一个您可以使用参考的示例:

// 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 放在哪里?以及如何在多个表单和类的多个线程中安全地使用此功能?

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

4

0 回答 0