GZIP Statico e Multithreading

Dopo aver scritto l’articolo sul GZIP statico, la mia indole ottimizzatrice si è messa al lavoro quando ho dovuto per vari motivi modificare il programma che in quel post avevo pubblicato.

Mi sono chiesto perché l’avevo creato così, considerato che su un i7 con 4+4 core, la potenza di calcolo disponibile era più che sprecata.

Problema risolto.

static void Main(string[] args)
{
    DirectoryInfo di = new DirectoryInfo(@"root");

    ConcurrentQueue<FileInfo> q = new ConcurrentQueue<FileInfo>(di.GetFiles("*", SearchOption.AllDirectories));

    for (int i = 0; i < Environment.ProcessorCount; i++)
    {
        Thread t = new Thread(new ParameterizedThreadStart(thread));
        t.Start(q);
    }
}

static void thread(object b)
{
    ConcurrentQueue<FileInfo> q = (ConcurrentQueue<FileInfo>)b;
            
    while(!q.IsEmpty)
    {
        FileInfo f;
        if(q.TryDequeue(out f))
            compressFile(f);
    }
}

static void compressFile(FileInfo f)
{
    if (!f.Name.StartsWith(".") && f.Extension != ".php" && f.Extension != ".gz" && f.Extension != ".ini")
    {
        FileInfo f2 = new FileInfo(f.FullName + ".gz");

        if (f.LastWriteTime > f2.LastWriteTime)
        {
            ProcessStartInfo psi = new ProcessStartInfo("gzip.exe", "-9 -k -f \"" + f.FullName + "\"");
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(psi).WaitForExit();

            f2.Refresh();
        }

        if (f2.Exists && f2.Length >= f.Length)
            f2.Delete();
    }
}

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *