首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程化和实心化原则

线程化和实心化原则
EN

Stack Overflow用户
提问于 2012-03-29 18:06:56
回答 2查看 298关注 0票数 2

我有一个以下代码设置

代码语言:javascript
复制
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类中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-29 18:15:01

Logger有责任确保它不会阻塞调用者。它可以使用许多不同的策略来实现这一点。你不想把这些策略放到使用它的类中。

我会将消息排队到BlockingCollection<T>中,并让单个IO线程将其写出到磁盘。

我还建议模仿现有的日志记录接口,例如Common.Logging's ILog,这样如果您的“没有第三方”的要求被取消,您就可以轻松地切换到现有的日志记录框架。

类似于:

代码语言:javascript
复制
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线程的终止条件、字段、多个记录器的处理等内容...)

票数 3
EN

Stack Overflow用户

发布于 2012-03-29 18:10:24

Logger类有望负责日志记录。因此,它似乎是将传入数据记录到磁盘的正确位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9923222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档