неважно. Я не заметил, что его синглтон является частным и используется внутри методов write и writeline.
я есть многопоточное приложение для сканирования портов, написанное на C #, и я хочу напечатать некоторые вещи как в консоль, так и в файл журнала при запуске приложения. По этой причине у меня есть следующий вспомогательный класс, который прекрасно работает при записи как в файл журнала, так и в консоль.
public class Output
{
private const string LOG_DIRECTORY = "Logs";
private readonly string LogDirPath = Path.Combine(Directory.GetCurrentDirectory(), LOG_DIRECTORY);
private static Output _outputSingleton;
private static Output OutputSingleton {
get {
if (_outputSingleton == null)
{
_outputSingleton = new Output();
}
return _outputSingleton;
}
}
public StreamWriter SW { get; set; }
public Output()
{
EnsureLogDirectoryExists();
InstantiateStreamWriter();
}
~Output()
{
if (SW != null)
{
try
{
SW.Dispose();
}
catch (ObjectDisposedException) { } // object already disposed - ignore exception
}
}
public static void WriteLine(string str)
{
Console.WriteLine(str);
OutputSingleton.SW.WriteLine(str);
}
public static void Write(string str)
{
Console.Write(str);
OutputSingleton.SW.Write(str);
}
private void InstantiateStreamWriter()
{
long ticks = DateTime.Now.Ticks;
string logFilename = "scan_" + ticks.ToString() + ".txt";
string filePath = Path.Combine(LogDirPath, logFilename);
try
{
SW = new StreamWriter(filePath);
SW.AutoFlush = true;
}
catch (UnauthorizedAccessException ex)
{
throw new ApplicationException(string.Format("Access denied. Could not instantiate StreamWriter using path: {0}.", filePath), ex);
}
}
private void EnsureLogDirectoryExists()
{
if (!Directory.Exists(LogDirPath))
{
try
{
Directory.CreateDirectory(LogDirPath);
}
catch (UnauthorizedAccessException ex)
{
throw new ApplicationException(string.Format("Access denied. Could not create log directory using path: {0}.", LogDirPath), ex);
}
}
}
}
Проблема заключается в том, что, поскольку мое приложение является многопоточным, иногда я создаю несколько файлов журнала, каждый из которых записывается частично, а иногда выдается исключение, поскольку один поток не может получить доступ к одному и тому же месту для записи, пока он используется другим потоком. Есть ли способ сделать мой вышеOutput
класс многопоточный тоже, чтобы избежать вышеупомянутых проблем?