C # Best Practice, используемый для многопоточности приложений, создание журнала кросс-формы экземпляра - PullRequest
0 голосов
/ 10 января 2019

Я создаю пользовательский интерфейс, который состоит из одной основной формы с возможными экземплярами дополнительных форм и пользовательских классов. То, что я все еще пропускаю, является последовательным способом регистрации ошибок. Поэтому я создал блоки 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? И как мне безопасно использовать эту функцию в нескольких потоках в разных формах и классах?

Большое спасибо заранее за то, что позволили мне учиться у ваших гуру:)

...