[英].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.