如何有争议地循环以获得打印机状态

时间:2016-02-17 09:03:46

标签: c#

我编写了一个简单的控制台应用程序来检查打印机的状态。当打印机状态变为“打印状态”时,控制台应用程序只会写出一条消息“打印机正在打印”。

现在我遇到的困难是让这个程序继续检查打印机的状态..我不太确定我必须使用什么循环以及如何应用它。请参阅以下内容以获取更多信息:

 public static void getPrintJob()
        {
            string printerName = "Some Printer Name";
            string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection coll = searcher.Get();

            foreach (ManagementObject printer in coll)
            {
               if (Convert.ToInt32(printer.Properties["PrinterStatus"].Value) == 4)
               {
                   Console.Write("Printer is Printing");
               }

我可以为此程序提供什么样的循环以持续检查打印机状态?并且每当状态更改为4(打印机上的打印状态,我的目标)。

1 个答案:

答案 0 :(得分:1)

如果你想让它永远运行,while循环将起作用:

 public static void getPrintJob()
    {
        string printerName = "Some Printer Name";
        string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

        while(true)
        {
            ManagementObjectCollection coll = searcher.Get();
            var alreadyPrinting = false;
            foreach (ManagementObject printer in coll)
            {
               if (Convert.ToInt32(printer.Properties["PrinterStatus"].Value) == 4 && !alreadyPrinting)
               {
                   Console.Write("Printer is Printing");
                   alreadyPrinting = true;
               }
               else
               {
                    alreadyPrinting = false;
               }
            }
            Thread.Sleep(1000);
        }
    }

正如RB在评论中指出的那样,Thread.Sleep(1000)将暂停循环1秒钟并停止占用所有CPU资源。

编辑: 评论后更新。

添加了一个bool来跟踪打印机是否已经打印。只要打印机正在打印,这就会停止代码写入控制台。多台打印机可以启动并写入控制台。但每个打印作业只有一次。

在while循环中移动了coll变量赋值。