public void OnOpenWriter(object source, RWEventArgs e)
 {
     if (outputBox.InvokeRequired)
     {
         // invoke to have the function call on the same thread as the writer object
         var d = new Writer.WriterOpen(OnOpenWriter);
         outputBox.Invoke(d, new object[] { source, e });
     }
     else
     {
         // print out the writer's id and opening message
         Debug.WriteLine($"Opening writer.");
         outputBox.AppendText($"Writer {e.ID} Open.\n");
     }
 }
        public void OnCloseWriter(object source, RWEventArgs e)
        {
            if (outputBox.InvokeRequired)
            {
                // invoke to have the function call on the same thread as the writer object
                var d = new Writer.WriterClose(OnCloseWriter);
                outputBox.Invoke(d, new object[] { source, e });
            }
            else
            {
                // print out the writer's id and opening message
                Debug.WriteLine($"Closing writer.");

                outputBox.AppendText($"Writer {e.ID} Closed.\n");
                queueProgressBar.Value = writers.Count; // update the queue size

                if (!refresh.Enabled)
                {
                    refresh.Enabled = true;
                }
            }
        }