Sincronización de acceso a hilos y escritura en C #

Tengo una aplicación de escáner de puertos multiproceso escrita en C #, y quiero imprimir algunas cosas tanto en la consola como en un archivo de registro mientras se ejecuta la aplicación. Por esta razón, tengo la siguiente clase auxiliar, que funciona bien al escribir tanto en un archivo de registro como en la consola.

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);
            }
        }
    }
}

El problema es que, dado que mi aplicación es multiproceso, a veces obtengo múltiples archivos de registro creados, cada uno de ellos parcialmente escrito, y a veces recibo una excepción, ya que un hilo no puede acceder al mismo lugar para escribir mientras lo está usando otro hilo. ¿Hay alguna manera de hacer mi arribaOutput clase multiproceso también, para evitar los problemas mencionados anteriormente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta