螺纹和SOLID原理
本文关键字:原理 SOLID | 更新日期: 2023-09-27 18:29:18
我有以下代码设置
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);
}
}
}
}
因此,我在我的主类中创建了一个新的Task,然后数据被添加到DataInCollection中,以便在数据进入时对其进行排队,我们大约每30毫秒进行一次讨论。这得到了成功的处理。
我现在想在一个单独的线程上将数据写入文件,这样,如果出现磁盘问题,主逻辑检查就不会受到影响。如果存在磁盘问题,则逻辑可以继续。我只是不确定在单独的线程上在哪里写文件?它是在Main类、Logic类还是Logger类中?
Logger
的责任是确保它不会阻塞调用者。它可以使用许多不同的策略。你不想把这些策略烘焙到使用它的类中
我会将消息排入BlockingCollection<T>
,并让一个IO线程将其写入磁盘。
我还建议您模仿现有的日志记录接口,例如Common.logging的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线程的终止条件、字段、多个记录器的处理等内容)