créer plusieurs fichiers en utilisant plusieurs threads en c#

Je suis en création d'application console pour simuler le serveur. J'ai créer plusieurs fichiers de virus, ensemble, l'utilisation de plusieurs threads pour voir si tous les fichiers mis en quarantaine, si oui, combien de temps il faut pour en quarantaine. Le problème avec le multithreading application est un thread commence à écrire un autre thread si je reçois exception - Le processus ne peut pas accéder au fichier X, car le fichier est utilisé par un autre processus. C'est la raison pour que tous les fichiers n'obtenez pas mis en quarantaine. J'utilise framework 4.5.2 J'ai créé une application avec fil et de la tâche. Je n'ai pas le désir de résultat. Quelle est la meilleure pratique pour écrire cette application? Merci de m'aider à l'avance.

À L'Aide De Fil:

class Program
{
    static string folderPath;
    static readonly string fileContent = @"X5O!P%%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*";

    static void Main(string[] args)
    {
        folderPath = "F:\VirusScan";

        int counter = 1000;
        for (int i = 0; i < counter; i++)
        {
            var thread = new Thread(() => GenerateVirusFile(i));
            thread.Start();
        }

        Console.ReadKey();
    }

    static void GenerateVirusFile(int i)
    {
        string filePath = [email protected]"{folderPath}\TestForVirusScan_{i}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.txt";

        try
        {
            using (StreamWriter writer = new StreamWriter(filePath))
            {
                writer.WriteLine(fileContent);
            }

            var timer = Stopwatch.StartNew();
            while (true)
            {
                if (!File.Exists(filePath))
                {
                    Console.WriteLine($"{i}: File was removed in {timer.ElapsedMilliseconds}ms");
                    break;
                }
                else
                {
                    Thread.Sleep(1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"{i}: Exception {ex.GetType().Name} occurred: {ex.Message}");
        }
    }
}

À L'Aide De La Tâche:

class Program
{
    static string folderPath;
    static readonly string fileContent = @"X5O!P%%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*";

    static void Main(string[] args)
    {
        folderPath = "F:\VirusScan";

        int counter = 1000;
        List<Task> tasks = new List<Task>();

        for (int i = 1; i <= counter; i++)
        {
            Task newTask = new Task((x) => GenerateVirusFile(x), i);                
            tasks.Add(newTask);
        }

        foreach (var task in tasks)
        {
            task.Start();
        }

        Task.WaitAll(tasks.ToArray()); 

        Console.ReadKey();
    }

    public static void GenerateVirusFile(object i)
    {
        string filePath = [email protected]"{folderPath}\TestForVirusScan_{i}_{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.txt";

        try
        {
            using (StreamWriter writer = new StreamWriter(filePath))
            {
                writer.WriteLine(fileContent);
            }

            var timer = Stopwatch.StartNew();
            while (true)
            {
                if (!File.Exists(filePath))
                {
                    Console.WriteLine($"{i}: File was removed in {timer.ElapsedMilliseconds}ms");
                    break;
                }
                else
                {
                    Thread.Sleep(1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"{i}: Exception {ex.GetType().Name} occurred: {ex.Message}");
        }
    }
}
+2
2019-09-18 20:42:20
source
1 réponses

Nous pouvons convertir Date à factor par ID qui vous donnera la valeur unique pour chaque Date

ave(as.integer(df$Date),df$ID,FUN = factor)
#[1] 1 2 2 1 1 3

Nous pouvons également utiliser dense_rank avec dplyr

library(dplyr)
df %%>%%
  group_by(ID) %%>%%
  mutate(count_n = dense_rank(Date))

#  ID    Date        need count_n
#  <fct> <date>     <dbl>   <int>
#1 x1    2006-08-23     1       1
#2 x1    2006-08-30     2       2
#3 x1    2006-08-30     2       2
#4 X2    2006-09-06     1       1
#5 X3    2006-09-13     1       1
#6 x1    2006-09-20     3       3
+2
2019-09-18 21:38:12

Voir d'autres questions sur les étiquettes