/// <summary>
        /// Any Task
        /// </summary>
        private async Task SendAsync(PrintJobEvent arg)
        {
            // Run
            await Task.Run(() => {
                Console
                .WriteLine(
                    $"Run {Thread.CurrentThread.ManagedThreadId} Thread" +
                    $"With {arg.Flag} argument: {arg.StatusMask}");

                #region Send Remote Web Api Connection

                // String Data
                string data = "";
                // Api Adres
                string api = "";
                // Remote Uri
                Uri uri;

                try {
                    // Initialize Data Serializer
                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    // data set
                    data = serializer.Serialize(arg);
                    // api set
                    api = getAppSetting("api");
                    // Remote Web Service
                    uri = new Uri(api);
                    // Create a request using a URL that can receive a post.
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
                    // Request method
                    request.Method = "post";
                    // Convert POST data to a byte array.
                    byte[] byteArray = Encoding.UTF8.GetBytes(data);
                    // Set the ContentType property of the WebRequest.
                    request.ContentType = "application/json; charset=UTF-8";
                    request.Accept      = "application/json";
                    // Set the ContentLength property of the WebRequest.
                    request.ContentLength = byteArray.Length;
                    // Get the request stream.
                    Stream dataStream = request.GetRequestStream();
                    // Write the data to the request stream.
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    // Close the Stream object.
                    dataStream.Close();
                }
                catch (Exception) {
                    Console.WriteLine($"Connection Fail {api}");
                }
                #endregion
            });
        }
        /// <summary>
        /// Bind this Window
        /// </summary>
        /// <param name="e"></param>
        private void Bind(PrintJobEvent e)
        {
            #region Define Event Data
            // Job Status       [ For example: Spooling ]
            string stringJobStatus = $"{e.JobStatus}";

            // Priority         [ For example: 1 ]
            string stringPriority = $"{e.Priority}";

            // Document         [ For example: test.pdf ]
            string stringDocument = $"{e.Document}";

            // User             [ For example: Jack     ]
            string stringUser = $"{e.Owner}";

            // Host             [ For example: desktop-computer-100 ]
            string stringHost = $"{e.HostPrintQueue}";

            // JobId            [ For example: 50 ] This day print count
            string stringJobId = $"{e.JobId}";

            // Total Pages      [ For example: 5 ] Print document pages count
            string stringTotalPages = $"{e.TotalPages}";

            // TimeSubmitted    [ For example: 201907181459 ] Print send datetime
            string stringTimeSubmitted = $"{e.TimeSubmitted}";

            #endregion

            // cref="https://docs.microsoft.com/tr-tr/dotnet/api/system.windows.threading.dispatcher"
            Dispatcher.Invoke(() => {
                // Show on his terminating mission
                if (WindowState == WindowState.Minimized)
                {
                    WindowState = WindowState.Normal;
                }

                lblDocument.Content      = stringDocument;
                lblHost.Content          = stringHost;
                lblJobId.Content         = stringJobId;
                lblJobStatus.Content     = stringJobStatus;
                lblPriority.Content      = stringPriority;
                lblTimeSubmitted.Content = stringTimeSubmitted;
                lblTotalPages.Content    = stringTotalPages;
                lblUser.Content          = stringUser;
            });
        }
        /// <summary>
        /// Hardware Signal
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void Hardware_Signal(object sender, PrintJobEvent e)
        {
            #region Define Event Data

            // Job Status       [ For example: Spooling ]
            string stringJobStatus = $"{e.JobStatus}";

            // Priority         [ For example: 1 ]
            string stringPriority = $"{e.Priority}";

            // Document         [ For example: test.pdf ]
            string stringDocument = $"{e.Document}";

            // User             [ For example: Jack     ]
            string stringUser = $"{e.Owner}";

            // Host             [ For example: desktop-computer-100 ]
            string stringHost = $"{e.HostPrintQueue}";

            // JobId            [ For example: 50 ] This day print count
            string stringJobId = $"{e.JobId}";

            // Total Pages      [ For example: 5 ] Print document pages count
            string stringTotalPages = $"{e.TotalPages}";

            // TimeSubmitted    [ For example: 201907181459 ] Print send datetime
            string stringTimeSubmitted = $"{e.TimeSubmitted}";

            #endregion

            #region Write Message
            System.Console.WriteLine
                ($"" +
                $"Flag           :   {e.Flag} \n" +
                $"Job Status     :   {stringJobStatus} \n" +
                $"Priorty        :   {stringPriority} \n" +
                $"Document       :   {stringDocument} \n" +
                $"User           :   {stringUser} \n" +
                $"Host           :   {stringHost} \n" +
                $"JobId          :   {stringJobId} \n" +
                $"Total Pages    :   {stringTotalPages} \n" +
                $"Time Submitted :   {stringTimeSubmitted} \n");
            #endregion

            #region Check Signal Flag
            switch (e.Flag)
            {
            case PrintJobEvent.StatusFlag.Paused:
                break;

            case PrintJobEvent.StatusFlag.Error:
                break;

            case PrintJobEvent.StatusFlag.Deleting:
                break;

            case PrintJobEvent.StatusFlag.Spooling:
                break;

            case PrintJobEvent.StatusFlag.Printing:
                break;

            case PrintJobEvent.StatusFlag.Offline:
                break;

            case PrintJobEvent.StatusFlag.Paperout:
                break;

            case PrintJobEvent.StatusFlag.Printed:
                break;

            case PrintJobEvent.StatusFlag.Deleted:
                break;

            case PrintJobEvent.StatusFlag.Blocked_DevQ:
                break;

            case PrintJobEvent.StatusFlag.User_Intervention_Req:
                break;

            case PrintJobEvent.StatusFlag.Restart:
                break;

            case PrintJobEvent.StatusFlag.Continue:     // Signal CONTINUE
                break;

            case PrintJobEvent.StatusFlag.Finalize:     // Signal END
                break;

            default:                                    // Signal START
                if (e.StatusMask == 0 && e.TotalPages == 0)
                {
                    // First data
                }
                break;
            }
            #endregion

            #region Run Other Task Trigger
            await SendAsync(e.Flag);

            #endregion
        }
        /// <summary>
        /// Hardware Signal
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Hardware_Signal(object sender, PrintJobEvent e)
        {
            // Bind Event Data
            Bind(e);

            Console.WriteLine($"Flag -> {e.Flag} - {e.Size}");

            #region Check Signal Flag
            switch (e.Flag)
            {
            case PrintJobEvent.StatusFlag.Paused:
                break;

            case PrintJobEvent.StatusFlag.Error:
                break;

            case PrintJobEvent.StatusFlag.Deleting:
                break;

            case PrintJobEvent.StatusFlag.Spooling:

                if (e.StatusMask == 8 && e.TotalPages == 0)
                {
                    finalAndClose();
                    Console.WriteLine($"1 Pages Printed.[{e.Size}]");

                    #region Run Other Task Trigger
                    _ = SendAsync(e);
                    #endregion
                }
                break;

            case PrintJobEvent.StatusFlag.Printing:
                break;

            case PrintJobEvent.StatusFlag.Offline:
                break;

            case PrintJobEvent.StatusFlag.Paperout:
                break;

            case PrintJobEvent.StatusFlag.Printed:
                break;

            case PrintJobEvent.StatusFlag.Deleted:
                break;

            case PrintJobEvent.StatusFlag.Blocked_DevQ:
                break;

            case PrintJobEvent.StatusFlag.User_Intervention_Req:
                break;

            case PrintJobEvent.StatusFlag.Restart:
                break;

            case PrintJobEvent.StatusFlag.Idled:
                finalAndClose();
                Console.WriteLine($"{e.PagesPrinted} Pages Printed.[{e.Size}] Total : {e.TotalPages}");

                #region Run Other Task Trigger
                _ = SendAsync(e);
                #endregion

                break;

            case PrintJobEvent.StatusFlag.Continue:
                break;

            case PrintJobEvent.StatusFlag.Finalize:
                if (e.Size == 0)
                {
                    finalAndClose();
                    Console.WriteLine($"{e.PagesPrinted} Pages Printed.[{e.Size}] Total : {e.TotalPages}");

                    #region Run Other Task Trigger
                    _ = SendAsync(e);
                    #endregion
                }
                break;

            default:
                break;
            }
            #endregion
        }