gpt4 book ai didi

c# - 线程和SOLID原理

转载 作者:行者123 更新时间:2023-11-30 21:08:02 25 4
gpt4 key购买 nike

我有以下代码设置

public interface ILogger
{
void WriteData(string Data);
}

public class Logger : ILogger
{
public void WriteData(string Data)
{
//Write to disk
}
}

public interface ILogic
{
void ProcessData(string Data);
}

public class Logic : ILogic
{
private ILogger Logger;

public Logic(ILogger Logger)
{
this.Logger = Logger;
}

public void ProcessData(string Data)
{
//Do stuff
Logger.WriteData("Data to write");
}
}

public class MainEntryPointClass
{
private BlockingCollection<string> DataInCollection;
private Task DataInTask;
private CancellationTokenSource CancellationTokenSource;

public Start()
{
InitializeDataIn();
}

private void InitializeDataIn()
{
CancellationTokenSource = new CancellationTokenSource();
DataInCollection = new BlockingCollection<DataInContents>();
DataInTask = Task.Factory.StartNew(() => ProcessDataIn(CancellationTokenSource.Token));
}

private void ProcessDataIn(CancellationToken CancelToken)
{
while (!CancelToken.IsCancellationRequested)
{
foreach (var item in DataInCollection.GetConsumingEnumerable())
{
Logic.ProcessData(item);
}
}

}
}

所以我在我的主类中创建了一个新任务,然后将数据添加到 DataInCollection 以在数据传入时对数据进行排队,我们大约每 30 毫秒讨论一次。这得到处理成功。

我现在想在一个单独的线程上将数据写入文件,这样如果出现磁盘问题,主要逻辑检查就不会受到影响。如果存在磁盘问题,则逻辑可以继续。我只是不确定我在单独的线程上在哪里写文件?是在Main类、Logic类还是Logger类?

最佳答案

Logger有责任确保它不会阻止调用者。它可以为此使用许多不同的策略。您不想将这些策略融入到使用它的类中。

我会将消息放入 BlockingCollection<T> 中,并让单个 IO 线程将其写入磁盘。

我还建议模仿现有的日志记录界面,例如 Common.Logging's ILog 因此,如果您的“无第三方”要求被取消,您可以轻松切换到现有的日志记录框架。

类似于:

class AsyncLogger:ILogger
{
public AsyncLogger(ILogger backingLogger)
{
new Thread(()=>
{
while(true)
{
var data=_queue.Take();
_backingLogger.WriteData(data);
}
}
).Start();
}

public void WriteData(string data)
{
_queue.Enqueue(data);
}
}

(我省略了诸如 IO 线程的终止条件、字段、多个记录器的处理……)

关于c# - 线程和SOLID原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923222/

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