Ведение журнала при выполнении нескольких задач в сервисе windows - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу записывать все журналы в разных задачах в разные журналы, как указано в фрагменте кода ниже. Но с помощью приведенного ниже кода он записывает журналы во все файлы журналов, созданные в разных задачах, но журналы, написанные для задачи, объединяются с журналами, написанными другой задачей.

       private static string logFile;
       private static void CreateEmptyFile(string filename)
       {
            if (!File.Exists(filename))
            {
                File.Create(filename).Dispose();
            }
       }

       private static void Log(string logMessage, string path)
       {
            string timeStamp = String.Format("{0} {1} - ", DateTime.Now.ToLongDateString(), DateTime.Now.ToLongTimeString());
            File.AppendAllText(path, timeStamp + logMessage + Environment.NewLine);
       }

       private static void TaskMethod1(arg1)
       {
            // It calls a bunch of functions and they all log to logfile and all these operation including bunch of functions called(they also log using Log method)
            logFile = DateTime.Now.ToFileTime() + ".txt";
            CreateEmptyFile(logFile);
            Log("TaskMethod1", logFile);
       }
       private static async Task TaskMethod()
       {
           while(runningService)
           {
              // Thi will create more than one task in parallel to run and each task can take upto 30 minutes to finish. Based on some condition the upper limit for parallel tasks can go upto 10.
              Task.Run(() => TaskMethod1(arg1);
           }
       }
       internal static void Start()
        {
            runningService = true;
            Task1 = Task.Run(() => TaskMethod());
        }

Я хочу, чтобы все файлы журналов для разных задач быть отделенным и содержимое одной задачи не должно быть объединено с содержанием другой задачи. Я подозреваю, что это из-за глобальной переменной logFile, которая меняет свое значение при создании новой задачи, но я не уверен, является ли это причиной записи журналов в журналы других задач? Как я могу решить это, если это проблема? Должен ли я передавать logFile в качестве аргумента каждой функции вместо того, чтобы объявлять ее глобально.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете указать имя файла журнала перед запуском задачи и передать его в качестве параметра рабочей функции:

private static async Task TaskMethod()
{
    while (runningService)
    {
        // I am assuming this is not your original code which would create
        // a huge amount of parallel tasks without any checks..
        // if there is no sleep or no wait for synchronization, 
        // many tasks will be created in the same millisecond and will have
        // the same log file name, which would be the least of your problems!
        string logFile = DateTime.Now.ToFileTime() + ".txt";
        Task.Run(() => TaskMethod1(arg1, logFile));
    }
}

И теперь ваш TaskMethod1 должен выглядеть следующим образом:

// Does not compile. I only add the new string type parameter to the end.
// Your code is not complete, so the answer has to assume that you 
// understand that only one string logFile parameter is appended to the
// end of your parameter list
private static void TaskMethod1(arg1, string logFile)
{
    CreateEmptyFile(logFile);
    Log("TaskMethod1", logFile);
}
...