Объект получен как ноль при отправке через событие - PullRequest
0 голосов
/ 15 сентября 2018

У меня довольно простой Logger

public class Logger: ILogger
{
  public event EventHandler<MessageLoggedArgs> MessageLogged;
  ...
  public void LogMessage(string msg, LogType logType)
  {
    var logItem = new LogItem(msg, logType);
    addLogMessage(logItem);
  }

  private void addLogMessage(LogItem logItem)
  {
    MessageLogged?.Invoke(this, new MessageLoggedArgs(logItem));
  }
}

public class MessageLoggedArgs
{ 
   public LogItem LogItem {get;}
   public MessageLoggedArgs(LogItem logitem)
   {
       LogItem = logItem;
   }
}

public class LogsProcessor
{ 
    public LogsProcessor(ILogger logger)
    {
        _logger = logger;
        _logger.MessageLogged += OnMessageLogged;

    }

    private volatile List<LogItem> buffer = new List<LogItem>();

    private ManualResetEvent ev = new ManualResetEvent(true);

    private void OnMessageLogged(object sender, MessageLoggerArgs e)
    {
        buffer.Add(e.LogItem);
        ev.Set();
    }

    //Runs on a thread
    private void process()
    {
       while(true)
       {
          ev.WaitOne(Timeout.Infinite);

          if(buffer.Count != 0)
          {
              while(buffer.Count != 0)
              {
                  var item = logbuffer[0];
                  buffer.RemoveAt(0);
                  Application.Current.Dispatcher.BeginInvoke
                                 ( new Action( () => { //Log to UI }));
              }

          }
          else
             ev.Reset();
       }
    }
}

Потребитель этого класса получает несколько нулевых объектов, когда генерируется много журналов.Возможно ли, что объекты собирают мусор?Если да, то как это возможно, чтобы журналы собирались мусором, даже если внутри MessageLoggedAgs всегда есть ссылка на живой объект?Это сбило меня с толку.

Редактировать: Оказывается, что проблема как-то из-за доступа к буферу с помощью потока.Мне удалось устранить эту проблему с помощью ConcurrentQueue.Однако я не знаю, где именно проблема была раньше.Я думал, что это не будет проблемой, если я получаю доступ к буферу, используя один поток.

...