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