簡體   English   中英

.NetCore - 使用 Semaphoreslim 的異步記錄器

[英].NetCore - Async Logger using Semaphoreslim

我正在嘗試根據以下要求創建邏輯。

  • class應該output到一個文件
  • class 必須保留消息的順序
  • 調用日志不會阻塞調用線程
  • 調用 Log 必須是線程安全的(會被多線程調用)

我試過的示例代碼如下

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM