public MainWindow()
        {
            InitializeComponent();

            LoggerSingletone.Begin(rtbLogWindow);

            // Create event handlers
            bSubmit.Click      += BSubmit_Click;
            bSendMessage.Click += BSendMessage_Click;
            FormClosing        += MainWindow_FormClosing;
        }
        private void BSendMessage_Click(object sender, EventArgs e)
        {
            // Create separate thread for sending messages
            var ButtonHandlerThread = new Thread(() =>
            {
                try
                {
                    // Write message to pipe
                    var message = tbMessage.Text;
                    if (message.Length > 0)
                    {
                        var bBuffer      = Encoding.Unicode.GetBytes(message);
                        var bBufferCount = Encoding.Unicode.GetByteCount(message);

                        namedPipe.Write(bBuffer, 0, bBufferCount);

                        // Add new entry to log
                        LoggerSingletone.WriteLineMutexed($"Client sent message: {message};");
                    }
                }
                catch (ArgumentException)
                {
                    LoggerSingletone.WriteLineMutexed("Message buffer failed;");
                }
                catch (Exception)
                {
                    LoggerSingletone.WriteLineMutexed($"Client lost connection to [{pipeName}];");

                    isConnectedToPipe = false;
                    setCEnabledInvoke(bSendMessage, false);
                    setCEnabledInvoke(tbMessage, false);

                    if (namedPipe != null)
                    {
                        namedPipe.Close();
                        namedPipe = null;
                    }

                    // Change text of button
                    setCTextInvoke(bSubmit, "Connect");
                }
            });

            ButtonHandlerThread.IsBackground = true;
            ButtonHandlerThread.Start();
        }
        private void BSubmit_Click(object sender, EventArgs e)
        {
            // Start new thread
            // and connect/disconnect pipe
            var ButtonHandlerThread = new Thread(() =>
            {
                // Disable button so client can't
                // interrupt operations
                setCEnabledInvoke(tbPipeName, false);
                setCEnabledInvoke(bSubmit, false);

                // Connect/Disconnect client
                if (isConnectedToPipe)
                {
                    // Disconnect old pipe
                    isConnectedToPipe = false;
                    setCEnabledInvoke(bSendMessage, false);
                    setCEnabledInvoke(tbMessage, false);

                    if (namedPipe != null)
                    {
                        namedPipe.Close();
                        namedPipe = null;
                    }

                    // Change text of button
                    setCTextInvoke(bSubmit, "Connect");

                    // Add new entry to log
                    LoggerSingletone.WriteLineMutexed($"Client disconnected from pipe [{pipeName}];");
                }
                else
                {
                    // Update pipe name and connect to server
                    if ((pipeName = tbPipeName.Text).Length > 0)
                    {
                        // Create new one-directional Named Pipe
                        namedPipe = new NamedPipeClientStream(".", pipeName, PipeDirection.Out);

                        // Try to connect client side
                        // with server side of pipe
                        try
                        {
                            namedPipe.Connect(5000);
                            LoggerSingletone.WriteLineMutexed($"Client connected to pipe [{pipeName}];");

                            // Unblock message section
                            isConnectedToPipe = true;
                            setCEnabledInvoke(bSendMessage, true);
                            setCEnabledInvoke(tbMessage, true);

                            // Change text of button
                            setCTextInvoke(bSubmit, "Disconnect");
                        }
                        catch (Exception)
                        {
                            LoggerSingletone.WriteLineMutexed($"Failed to connect to pipe [{pipeName}];");
                        }
                    }
                    else
                    {
                        LoggerSingletone.WriteLineMutexed("Pipe name can't be empty string;");
                    }
                }

                // Re-enable button
                setCEnabledInvoke(bSubmit, true);
                setCEnabledInvoke(tbPipeName, true);
            });

            ButtonHandlerThread.IsBackground = true;
            ButtonHandlerThread.Start();
        }