[英].NetCore - Async Logger using Semaphoreslim
我正在尝试根据以下要求创建逻辑。
我试过的示例代码如下
Ilogger log = new Logger();
Thread t1 = new Thread(LongRunningTask);
Thread t2 = new Thread(LongRunningTask2);
t1.Start();
t2.Start();
Console.WriteLine("Hello, World!");
async void LongRunningTask()
{
for (int i = 0; i < 10; i++)
{
await log.Info("Thread-1 - " + i.ToString());
}
}
async void LongRunningTask2()
{
for (int i = 0; i < 10; i++)
{
await log.Info("Thread-2 - " + i.ToString());
}
}
记录器具体 class 实现
internal class Logger : Ilogger
{
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1);
public async Task Info(string message)
{
try
{
await semaphoreSlim.WaitAsync();
Console.WriteLine(message);
//await File.WriteAllTextAsync("C://test.txt", message);
}
finally
{
semaphoreSlim.Release();
}
}
}
控制台 output 似乎没问题。 我正在按顺序收到消息。 但是,如果我尝试写入文件,则会出现错误
该进程无法访问文件“C:\test.txt”,因为它正被另一个进程使用
谁能帮助我了解我在这里做错了什么?
更新:
实际上问题出在 File.WriteAllText - 它将覆盖已经存在的内容。替换为
File.AppendAllTextAsync - 现在工作正常
尝试使用它来创建您的 SemaphoreSlim
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
现在这基本上可以作为互斥体使用——一次只允许一个线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.