gpt4 book ai didi

c# - 创建使用线程的静态类的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 12:16:36 24 4
gpt4 key购买 nike

假设我正在设计一个简单的日志记录类(是的 - 我知道已经有那些在野外了!)并且我希望该类是静态的,这样我的其余代码就可以无需先实例化即可调用它。也许是这样的:

internal static class Log
{
private static string _logFile = "";

internal static void InitializeLogFile(string path)
{
...
}
internal static void WriteHeader()
{
...
}
internal static void WriteLine(params string[] items)
{
...
}
}

现在,我希望内部组件启动自己的线程并以异步方式执行,可能使用 BackgroundWorker 来帮助简化事情。我应该只在每个方法中创建一个新的 BackgroundWorker,创建一个静态 BackgroundWorker 作为静态类的私有(private)属性,还是我完全忽略了某些东西?

最佳答案

您肯定不希望在每次调用方法时都启动一个新线程或 BackgroundWorker。我会在这里使用生产者-消费者模式。事实证明,这是一种常见的模式,Microsoft 为我们提供了 BlockingCollection 类,大大简化了实现。这种方法的好处在于:

  • 只需要一个额外线程
  • Log 方法将具有异步语义
  • 保留日志消息的时间顺序

这里有一些代码可以帮助您入门。

internal static class Log
{
private static BlockingCollection<string> s_Queue = new BlockingCollection<string>();

static Log()
{
var thread = new Thread(Run);
thread.IsBackground = true;
thread.Start();
}

private static void Run()
{
while (true)
{
string line = s_Queue.Take();
// Add code to append the line to the log here.
}
}

internal static void WriteLine(params string[] items)
{
foreach (string item in items)
{
s_Queue.Add(item);
}
}
}

关于c# - 创建使用线程的静态类的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4936228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com