我有一个以下代码设置
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中,以便在数据传入时对其进行排队,大约每30ms。这将得到成功的处理。
我现在想把数据写到一个单独线程上的文件中,这样即使有磁盘问题,主要的逻辑检查也不会受到影响。如果存在磁盘问题,则逻辑可以继续。我只是不确定在单独的线程上在哪里进行文件写入?它是在Main类、Logic类还是Logger类中?
发布于 2012-03-29 18:15:01
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线程的终止条件、字段、多个记录器的处理等内容...)
发布于 2012-03-29 18:10:24
Logger类有望负责日志记录。因此,它似乎是将传入数据记录到磁盘的正确位置。
https://stackoverflow.com/questions/9923222
复制相似问题