Admire Mhlaba Ответов: 2

Как сделать анонимную функцию вложенной внутри await task. run записи данных в файл


Good day, I need help to fix a logical error within an anonymous function executing inside await Task.Run(() =>. the logical error here is that nothing is being written to the file and no error is being raised inside try-catch block here is the code:


public static async Task LogActivity(string source, string message)
{
    try
    {
    
        await Task.Run(() => 
        {
            try
            {
            string logFile = "~/App_Data/ActivityLog.txt";
            
            logFile = HttpContext.Current.Server.MapPath(logFile);
            
            // Open the log file for append and write the log
            using (var stream = new StreamWriter(logFile, true))
            {
            stream.WriteLine("--------------------- Logged On: {0} --------------------", DateTime.Now);
            
            if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(message))
            {
            stream.Write("Activity Source: ");
            stream.WriteLine(source);
            stream.Write("Activity Status: ");
            stream.WriteLine(message);
            stream.WriteLine();
            }
            }
            }
            catch (Exception err)
            { }
        });
    }
    catch
    { }
}


Что я уже пробовал:

Все, что я пробовал, не сработало, так что не нужно делиться!!!!

2 Ответов

Рейтинг:
5

Admire Mhlaba

Это работает, но мне нужна помощь, чтобы заблокировать этот метод во время выполнения, чтобы избежать

race condition


public static async Task LogActivityAsync(string source, string message)
{
    try
    {
        string logFile = "~/App_Data/ActivityLog.txt";

        var context = HttpContext.Current;

        if (context != null)
        {
            logFile = context.Server.MapPath(logFile);

            // Open the log file for append and write the log
            using (var stream = new StreamWriter(logFile, true))
            {
                await stream.WriteLineAsync("--------------------- Activity Logged On: " + DateTime.Now + " --------------------");

                if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(message))
                {
                    await stream.WriteAsync("Activity Source: ");
                    await stream.WriteLineAsync(source);
                    await stream.WriteAsync("Activity Status: ");
                    await stream.WriteLineAsync(message);
                    await stream.WriteLineAsync();
                }
            }
        }

    }
    catch
    { }
}


Рейтинг:
2

Dave Kreskowiak

Ну, ваш код проглатывает любые исключения.

Во-первых, бессмысленно иметь этот код в задаче.Запуск и ожидание, потому что он в значительной степени просто будет работать однопоточно в любом случае.

Далее, ваш код упадет на лицо, если два запроса придут на сервер и выполнят этот метод одновременно. Тот, который открывает файл первым, должен работать (за исключением любых других проблем), в то время как второй не сможет открыть файл и выдаст исключение, потому что файл уже используется другим процессом.

Существует ли папка App_Data в папке вашего приложения при его развертывании? Возможно, вы захотите это выяснить.

Наконец, вполне возможно, что учетная запись, выполняющая ваш код на сервере, по умолчанию не имеет прав на запись в эту папку по соображениям безопасности. Вам придется выяснить, что это за учетная запись, и проверить ее права доступа.