Очистка очереди принтера правильно - PullRequest
0 голосов
/ 02 октября 2018

Сценарий - После создания приложения, которое может добавлять и удалять принтеры с пользовательских компьютеров, я сталкиваюсь с ключевой ошибкой:

1) Принтер не будет удален, еслизадания печати существуют в очереди печати (System32 \ spool \ PRINTERS), это файлы SPL и SHD

2) Если есть файл размером 23 000 КБ, мне нужен способ остановить процесс, пока команда незавершено

Мой текущий метод потока

                    Dim p As Process = New Process()
                    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
                    p.StartInfo.FileName = "cmd.exe"

                    For i = 0 To 2
                        Select Case i
                            Case 0
                                'Stop spooler and dependencies
                                p.StartInfo.Arguments = "/c net stop spooler /yes"
                                p.Start()

                            Case 1
                                'Delete all queues within folder
                                p.StartInfo.Arguments = "/c del C:\Windows\System32\spool\PRINTERS\*.* /F /Q"
                                p.Start()

                                'Delete printer
                                printer.Delete()

                            Case 2
                                'Restart the spooler service
                                p.StartInfo.Arguments = "/c net start spooler"
                                p.Start()

                        End Select
                    Next                 

с потоками :

    Dim p As Process = New Process()
                    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
                    p.StartInfo.FileName = "cmd.exe"

                    For i = 0 To 2
                        Select Case i
                            Case 0
                                'Stop spooler and dependencies
                                p.StartInfo.Arguments = "/c net stop spooler /yes"
                                p.Start()
                                'Allow time for the application to purge larger file sizes
                                Threading.Thread.Sleep(2500)
                            Case 1
                                'Delete all queues within folder
                                p.StartInfo.Arguments = "/c del C:\Windows\System32\spool\PRINTERS\*.* /F /Q"
                                p.Start()

                                'Delete printer
                                printer.Delete()

                            Case 2
                                'Restart the spooler service
                                p.StartInfo.Arguments = "/c net start spooler"
                                p.Start()

                                Threading.Thread.Sleep(2500)
                        End Select
                    Next

Оба эти метода не будут работатьправильно, приложение не дает достаточно времени для остановки службы спулера.Это означает, что файлы не будут удалены, что приведет к ошибкам при удалении принтера.

Что я надеюсь получить от этой темы :

Мне нужно несколько советов о том, какэффективно управлять этой процедурой.Большое спасибо

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете остановить службу из своего кода:

Option Infer On
Option Strict On

Imports System.ServiceProcess
'........

Sub StopService(ByVal serviceName As String)

    Using sc = New ServiceController(serviceName)
        Dim ts = TimeSpan.FromSeconds(30)
        Try
            sc.Stop()
            sc.WaitForStatus(ServiceControllerStatus.Stopped, ts)
            log.AppendFormatLine("Stopped {0} service.", serviceName)
        Catch ex As InvalidOperationException
            log.AppendFormatLine("** Could not stop {0} service because {1}.", serviceName, ex.Message)
        Catch ex As TimeoutException
            log.AppendFormatLine("** Timeout after waiting {0} seconds for {1} service to stop.", ts.Seconds.ToString)
        End Try
    End Using

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...