C# 后台任务未等待文件写入

C# 后台任务未等待文件写入,c#,C#,我有一个长期运行的后台任务,它只是一个while循环,不断迭代BlockingCollection,将消息记录到文件中。首先,我使用了一个foreach循环,它将创建一个streamwriter并异步写入该行 public static BlockingCollection<LogMessage> LogMessages = new BlockingCollection<LogMessage>(); private static async void Ru

我有一个长期运行的后台任务,它只是一个while循环,不断迭代BlockingCollection,将消息记录到文件中。首先,我使用了一个foreach循环,它将创建一个streamwriter并异步写入该行

    public static BlockingCollection<LogMessage> LogMessages = new BlockingCollection<LogMessage>();
    private static async void RunTask()
    {
        while (true)
        {
            var allMessages = LogMessages.GetConsumingEnumerable();
            foreach (var message in allMessages)
            {
                using (StreamWriter sr = new StreamWriter(File.Open(DebugPath, FileMode.Append)))
                {
                    await sr.WriteLineAsync(message.Text);
                }
            }
        }
    }

这是后台任务的预期行为吗?正确的方法是什么?

您可以运行单独的任务,将消息同步写入文件:

    public async void RunTask()
    {
        await DoTask();
    }

    public Task DoTask()
    {
        return Task.Run(() =>
        {
            using (StreamWriter sr = new StreamWriter(File.Open(DebugPath, FileMode.Append)))
            {
                foreach (var message in allMessages)
                {
                    sr.WriteLine(message);
                }
            }
        });
    }

我会使用append或write所有文本。我也会尝试每隔一段时间创建一个新文件…例如,在文件名上写上年\月\日\小时。。。这样每小时会有一个新文件。。。或者类似的。你可能需要冲洗过孔。不过,我同意,如果您希望在日志运行时查看日志,那么append可能是一种更好的方法。@JonathanAlfaro我刚刚将其更改为删除foreach和streamwriter,现在它是一个简单的文件。AppendAllLinesDebugPath,debugMessages;。同样的结果也发生了,我在VSCode中打开了该文件,它告诉我该文件正忙或已锁定。对于原始代码,您需要调用file.Open重载,该重载接受FileShare参数,以便您可以指定其他进程/句柄可以在打开文件时读取和/或写入该文件。我们为什么要这样做?有时候,解释一下你对这个问题的看法,以及这可能会有什么帮助,总是最好的
    public async void RunTask()
    {
        await DoTask();
    }

    public Task DoTask()
    {
        return Task.Run(() =>
        {
            using (StreamWriter sr = new StreamWriter(File.Open(DebugPath, FileMode.Append)))
            {
                foreach (var message in allMessages)
                {
                    sr.WriteLine(message);
                }
            }
        });
    }