Aracılığıyla paylaş


Nasıl yapılır: Sorunlu Yazdırma İşini Tanımlama

Ağ yöneticileri genellikle yavaş yazdırılmayan veya yazdırılmayan yazdırma işleri hakkında kullanıcılardan şikayetler alır. Microsoft .NET Framework API'lerinde kullanıma sunulan zengin yazdırma işi özellikleri kümesi, yazdırma işlerini hızlı bir şekilde uzaktan tanılamak için bir araç sağlar.

Örnek

Bu tür bir yardımcı program oluşturmak için başlıca adımlar aşağıdaki gibidir.

  1. Kullanıcının şikayetçi olduğu yazdırma işini belirleyin. Kullanıcılar bunu genellikle tam olarak yapamaz. Yazdırma sunucularının veya yazıcıların adlarını bilmiyor olabilirler. Yazıcının özelliğini ayarlarken Location kullanılandan farklı terminolojideki konumunu açıklamaktadır. Buna göre, kullanıcının şu anda gönderilen işlerinin listesini oluşturmak iyi bir fikirdir. Birden fazla varsa, sorun yaşayan işi saptamak için kullanıcı ve yazdırma sistemi yöneticisi arasındaki iletişim kullanılabilir. Alt bölümler aşağıdaki gibidir.

    1. Tüm yazdırma sunucularının listesini alın.

    2. Yazdırma kuyruklarını sorgulamak için sunucular arasında döngü yapın.

    3. Sunucu döngüsünün her geçişinde, işlerini sorgulamak için tüm sunucu kuyruklarında döngü yapın

    4. Kuyruk döngüsünün her geçişinde, işlerini döngüye alın ve şikayetçi kullanıcı tarafından gönderilenler hakkında tanımlayıcı bilgileri toplayın.

  2. Sorunlu yazdırma işi tanımlandığında, sorunun ne olabileceğini görmek için ilgili özellikleri inceleyin. Örneğin, iş bir hata durumunda mı yoksa iş yazdırılmadan önce kuyruğa hizmet eden yazıcı çevrimdışı mı oldu?

Aşağıdaki kod, bir dizi kod örneğidir. İlk kod örneği, yazdırma kuyrukları arasında döngü içerir. (Yukarıdaki 1c. adım.) değişkeni myPrintQueues , geçerli yazdırma sunucusunun nesnesidir PrintQueueCollection .

Kod örneği, geçerli yazdırma kuyruğu nesnesini ile PrintQueue.Refreshyenileyerek başlar. Bu, nesnenin özelliklerinin temsil ettiği fiziksel yazıcının durumunu doğru bir şekilde temsil etmesini sağlar. Ardından uygulama şu anda yazdırma kuyruğunda olan yazdırma işlerinin koleksiyonunu kullanarak GetPrintJobInfoCollectionalır.

Ardından uygulama koleksiyonda döngüler oluşturur PrintSystemJobInfo ve her Submitter özelliği şikayet eden kullanıcının diğer adıyla karşılaştırır. Eşleşirse, uygulama iş hakkındaki tanımlayıcı bilgileri sunulacak dizeye ekler. userName(ve jobList değişkenleri uygulamanın önceki bölümlerinde başlatılır.)

for each (PrintQueue^ pq in myPrintQueues)
{
   pq->Refresh();
   PrintJobInfoCollection^ jobs = pq->GetPrintJobInfoCollection();
   for each (PrintSystemJobInfo^ job in jobs)
   {
      // Since the user may not be able to articulate which job is problematic,
      // present information about each job the user has submitted.
      if (job->Submitter == userName)
      {
         atLeastOne = true;
         jobList = jobList + "\nServer:" + line;
         jobList = jobList + "\n\tQueue:" + pq->Name;
         jobList = jobList + "\n\tLocation:" + pq->Location;
         jobList = jobList + "\n\t\tJob: " + job->JobName + " ID: " + job->JobIdentifier;
      }
   }
}
foreach (PrintQueue pq in myPrintQueues)
{
    pq.Refresh();
    PrintJobInfoCollection jobs = pq.GetPrintJobInfoCollection();
    foreach (PrintSystemJobInfo job in jobs)
    {
        // Since the user may not be able to articulate which job is problematic,
        // present information about each job the user has submitted.
        if (job.Submitter == userName)
        {
            atLeastOne = true;
            jobList = jobList + "\nServer:" + line;
            jobList = jobList + "\n\tQueue:" + pq.Name;
            jobList = jobList + "\n\tLocation:" + pq.Location;
            jobList = jobList + "\n\t\tJob: " + job.JobName + " ID: " + job.JobIdentifier;
        }
    }// end for each print job
}// end for each print queue
For Each pq As PrintQueue In myPrintQueues
    pq.Refresh()
    Dim jobs As PrintJobInfoCollection = pq.GetPrintJobInfoCollection()
    For Each job As PrintSystemJobInfo In jobs
        ' Since the user may not be able to articulate which job is problematic,
        ' present information about each job the user has submitted.
        If job.Submitter = userName Then
            atLeastOne = True
            jobList = jobList & vbLf & "Server:" & line
            jobList = jobList & vbLf & vbTab & "Queue:" & pq.Name
            jobList = jobList & vbLf & vbTab & "Location:" & pq.Location
            jobList = jobList & vbLf & vbTab & vbTab & "Job: " & job.JobName & " ID: " & job.JobIdentifier
        End If
    Next job ' end for each print job

Next pq ' end for each print queue

Sonraki kod örneği, uygulamayı 2. Adım'da alır. (Yukarıya bakın.) Sorunlu iş belirlendi ve uygulama bunu tanımlayacak bilgileri ister. Bu bilgilerden , PrintQueueve PrintSystemJobInfo nesneleri oluştururPrintServer.

Bu noktada uygulama, yazdırma işinin durumunu denetlemenin iki yoluna karşılık gelen bir dallanma yapısı içerir:

Bu örnekte her iki yöntem de gösterilmiştir, bu nedenle kullanıcıdan daha önce hangi yöntemi kullanması istendiği soruldu ve özelliğin bayraklarını JobStatus kullanmak isterse "Y" ile yanıt verdi. İki yöntemin ayrıntıları için aşağıya bakın. Son olarak uygulama, işin günün bu saatinde yazdırılıp yazdırılamayacağını raporlamak için ReportQueueAndJobAvailability adlı bir yöntem kullanır. Bu yöntem, Yazdırma İşinin Günün Bu Saatinde Yazdırılıp Yazdırılamayacağını Bulma bölümünde ele alınmalıdır.

// When the problematic print job has been identified, enter information about it.
Console::Write("\nEnter the print server hosting the job (including leading slashes \\\\): " + "\n(press Return for the current computer \\\\{0}): ", Environment::MachineName);
String^ pServer = Console::ReadLine();
if (pServer == "")
{
   pServer = "\\\\" + Environment::MachineName;
}
Console::Write("\nEnter the print queue hosting the job: ");
String^ pQueue = Console::ReadLine();
Console::Write("\nEnter the job ID: ");
Int16 jobID = Convert::ToInt16(Console::ReadLine());

// Create objects to represent the server, queue, and print job.
PrintServer^ hostingServer = gcnew PrintServer(pServer, PrintSystemDesiredAccess::AdministrateServer);
PrintQueue^ hostingQueue = gcnew PrintQueue(hostingServer, pQueue, PrintSystemDesiredAccess::AdministratePrinter);
PrintSystemJobInfo^ theJob = hostingQueue->GetJob(jobID);

if (useAttributesResponse == "Y")
{
   TroubleSpotter::SpotTroubleUsingJobAttributes(theJob);
   // TroubleSpotter class is defined in the complete example.
} else
{
   TroubleSpotter::SpotTroubleUsingProperties(theJob);
}

TroubleSpotter::ReportQueueAndJobAvailability(theJob);
// When the problematic print job has been identified, enter information about it.
Console.Write("\nEnter the print server hosting the job (including leading slashes \\\\): " +
"\n(press Return for the current computer \\\\{0}): ", Environment.MachineName);
String pServer = Console.ReadLine();
if (pServer == "")
{
    pServer = "\\\\" +Environment.MachineName;
}
Console.Write("\nEnter the print queue hosting the job: ");
String pQueue = Console.ReadLine();
Console.Write("\nEnter the job ID: ");
Int16 jobID = Convert.ToInt16(Console.ReadLine());

// Create objects to represent the server, queue, and print job.
PrintServer hostingServer = new PrintServer(pServer, PrintSystemDesiredAccess.AdministrateServer);
PrintQueue hostingQueue = new PrintQueue(hostingServer, pQueue, PrintSystemDesiredAccess.AdministratePrinter);
PrintSystemJobInfo theJob = hostingQueue.GetJob(jobID);

if (useAttributesResponse == "Y")
{
    TroubleSpotter.SpotTroubleUsingJobAttributes(theJob);
    // TroubleSpotter class is defined in the complete example.
}
else
{
    TroubleSpotter.SpotTroubleUsingProperties(theJob);
}

TroubleSpotter.ReportQueueAndJobAvailability(theJob);
' When the problematic print job has been identified, enter information about it.
Console.Write(vbLf & "Enter the print server hosting the job (including leading slashes \\): " & vbLf & "(press Return for the current computer \\{0}): ", Environment.MachineName)
Dim pServer As String = Console.ReadLine()
If pServer = "" Then
    pServer = "\\" & Environment.MachineName
End If
Console.Write(vbLf & "Enter the print queue hosting the job: ")
Dim pQueue As String = Console.ReadLine()
Console.Write(vbLf & "Enter the job ID: ")
Dim jobID As Int16 = Convert.ToInt16(Console.ReadLine())

' Create objects to represent the server, queue, and print job.
Dim hostingServer As New PrintServer(pServer, PrintSystemDesiredAccess.AdministrateServer)
Dim hostingQueue As New PrintQueue(hostingServer, pQueue, PrintSystemDesiredAccess.AdministratePrinter)
Dim theJob As PrintSystemJobInfo = hostingQueue.GetJob(jobID)

If useAttributesResponse = "Y" Then
    TroubleSpotter.SpotTroubleUsingJobAttributes(theJob)
    ' TroubleSpotter class is defined in the complete example.
Else
    TroubleSpotter.SpotTroubleUsingProperties(theJob)
End If

TroubleSpotter.ReportQueueAndJobAvailability(theJob)

Özelliğin bayraklarını kullanarak yazdırma işinin JobStatus durumunu denetlemek için, ayarlı olup olmadığını görmek için ilgili her bayrağı denetlersiniz. Bir bitin bir bit bayrak kümesinde ayarlanıp ayarlanmadığını görmenin standart yolu, bir işlenen olarak bayrak kümesi, diğeri de bayrağın kendisini içeren bir mantıksal AND işlemi gerçekleştirmektir. Bayrağın kendisi yalnızca bir bit kümesine sahip olduğundan, mantıksal AND'nin sonucu en fazla aynı bitin ayarlanmış olmasıdır. Olup olmadığını öğrenmek için, mantıksal VE sonucunu bayrağın kendisiyle karşılaştırın. Daha fazla bilgi için bkz PrintJobStatus. , & İşleci (C# Başvurusu)ve FlagsAttribute.

Biti ayarlanmış her öznitelik için kod bunu konsol ekranına bildirir ve bazen yanıt vermek için bir yol önerir. (İş veya kuyruk duraklatıldıysa çağrılan HandlePausedJob yöntemi aşağıda açıklanmıştır.)

// Check for possible trouble states of a print job using the flags of the JobStatus property
static void SpotTroubleUsingJobAttributes (PrintSystemJobInfo^ theJob) 
{
   if ((theJob->JobStatus & PrintJobStatus::Blocked) == PrintJobStatus::Blocked)
   {
      Console::WriteLine("The job is blocked.");
   }
   if (((theJob->JobStatus & PrintJobStatus::Completed) == PrintJobStatus::Completed)
      || 
      ((theJob->JobStatus & PrintJobStatus::Printed) == PrintJobStatus::Printed))
   {
      Console::WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.");
   }
   if (((theJob->JobStatus & PrintJobStatus::Deleted) == PrintJobStatus::Deleted)
      || 
      ((theJob->JobStatus & PrintJobStatus::Deleting) == PrintJobStatus::Deleting))
   {
      Console::WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.");
   }
   if ((theJob->JobStatus & PrintJobStatus::Error) == PrintJobStatus::Error)
   {
      Console::WriteLine("The job has errored.");
   }
   if ((theJob->JobStatus & PrintJobStatus::Offline) == PrintJobStatus::Offline)
   {
      Console::WriteLine("The printer is offline. Have user put it online with printer front panel.");
   }
   if ((theJob->JobStatus & PrintJobStatus::PaperOut) == PrintJobStatus::PaperOut)
   {
      Console::WriteLine("The printer is out of paper of the size required by the job. Have user add paper.");
   }
   if (((theJob->JobStatus & PrintJobStatus::Paused) == PrintJobStatus::Paused)
      || 
      ((theJob->HostingPrintQueue->QueueStatus & PrintQueueStatus::Paused) == PrintQueueStatus::Paused))
   {
      HandlePausedJob(theJob);
      //HandlePausedJob is defined in the complete example.
   }

   if ((theJob->JobStatus & PrintJobStatus::Printing) == PrintJobStatus::Printing)
   {
      Console::WriteLine("The job is printing now.");
   }
   if ((theJob->JobStatus & PrintJobStatus::Spooling) == PrintJobStatus::Spooling)
   {
      Console::WriteLine("The job is spooling now.");
   }
   if ((theJob->JobStatus & PrintJobStatus::UserIntervention) == PrintJobStatus::UserIntervention)
   {
      Console::WriteLine("The printer needs human intervention.");
   }
};
// Check for possible trouble states of a print job using the flags of the JobStatus property
internal static void SpotTroubleUsingJobAttributes(PrintSystemJobInfo theJob)
{
    if ((theJob.JobStatus & PrintJobStatus.Blocked) == PrintJobStatus.Blocked)
    {
        Console.WriteLine("The job is blocked.");
    }
    if (((theJob.JobStatus & PrintJobStatus.Completed) == PrintJobStatus.Completed)
        ||
        ((theJob.JobStatus & PrintJobStatus.Printed) == PrintJobStatus.Printed))
    {
        Console.WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.");
    }
    if (((theJob.JobStatus & PrintJobStatus.Deleted) == PrintJobStatus.Deleted)
        ||
        ((theJob.JobStatus & PrintJobStatus.Deleting) == PrintJobStatus.Deleting))
    {
        Console.WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.");
    }
    if ((theJob.JobStatus & PrintJobStatus.Error) == PrintJobStatus.Error)
    {
        Console.WriteLine("The job has errored.");
    }
    if ((theJob.JobStatus & PrintJobStatus.Offline) == PrintJobStatus.Offline)
    {
        Console.WriteLine("The printer is offline. Have user put it online with printer front panel.");
    }
    if ((theJob.JobStatus & PrintJobStatus.PaperOut) == PrintJobStatus.PaperOut)
    {
        Console.WriteLine("The printer is out of paper of the size required by the job. Have user add paper.");
    }

    if (((theJob.JobStatus & PrintJobStatus.Paused) == PrintJobStatus.Paused)
        ||
        ((theJob.HostingPrintQueue.QueueStatus & PrintQueueStatus.Paused) == PrintQueueStatus.Paused))
    {
        HandlePausedJob(theJob);
        //HandlePausedJob is defined in the complete example.
    }

    if ((theJob.JobStatus & PrintJobStatus.Printing) == PrintJobStatus.Printing)
    {
        Console.WriteLine("The job is printing now.");
    }
    if ((theJob.JobStatus & PrintJobStatus.Spooling) == PrintJobStatus.Spooling)
    {
        Console.WriteLine("The job is spooling now.");
    }
    if ((theJob.JobStatus & PrintJobStatus.UserIntervention) == PrintJobStatus.UserIntervention)
    {
        Console.WriteLine("The printer needs human intervention.");
    }
}//end SpotTroubleUsingJobAttributes
' Check for possible trouble states of a print job using the flags of the JobStatus property
Friend Shared Sub SpotTroubleUsingJobAttributes(ByVal theJob As PrintSystemJobInfo)
    If (theJob.JobStatus And PrintJobStatus.Blocked) = PrintJobStatus.Blocked Then
        Console.WriteLine("The job is blocked.")
    End If
    If ((theJob.JobStatus And PrintJobStatus.Completed) = PrintJobStatus.Completed) OrElse ((theJob.JobStatus And PrintJobStatus.Printed) = PrintJobStatus.Printed) Then
        Console.WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.")
    End If
    If ((theJob.JobStatus And PrintJobStatus.Deleted) = PrintJobStatus.Deleted) OrElse ((theJob.JobStatus And PrintJobStatus.Deleting) = PrintJobStatus.Deleting) Then
        Console.WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.")
    End If
    If (theJob.JobStatus And PrintJobStatus.Error) = PrintJobStatus.Error Then
        Console.WriteLine("The job has errored.")
    End If
    If (theJob.JobStatus And PrintJobStatus.Offline) = PrintJobStatus.Offline Then
        Console.WriteLine("The printer is offline. Have user put it online with printer front panel.")
    End If
    If (theJob.JobStatus And PrintJobStatus.PaperOut) = PrintJobStatus.PaperOut Then
        Console.WriteLine("The printer is out of paper of the size required by the job. Have user add paper.")
    End If

    If ((theJob.JobStatus And PrintJobStatus.Paused) = PrintJobStatus.Paused) OrElse ((theJob.HostingPrintQueue.QueueStatus And PrintQueueStatus.Paused) = PrintQueueStatus.Paused) Then
        HandlePausedJob(theJob)
        'HandlePausedJob is defined in the complete example.
    End If

    If (theJob.JobStatus And PrintJobStatus.Printing) = PrintJobStatus.Printing Then
        Console.WriteLine("The job is printing now.")
    End If
    If (theJob.JobStatus And PrintJobStatus.Spooling) = PrintJobStatus.Spooling Then
        Console.WriteLine("The job is spooling now.")
    End If
    If (theJob.JobStatus And PrintJobStatus.UserIntervention) = PrintJobStatus.UserIntervention Then
        Console.WriteLine("The printer needs human intervention.")
    End If

End Sub

Ayrı özellikler kullanarak yazdırma işinin durumunu denetlemek için, her özelliği okumanız ve özelliği ise konsol ekranına rapor göndermeniz ve muhtemelen yanıt vermek için bir yol önermeniz yeterlidir true. (İş veya kuyruk duraklatıldıysa çağrılan HandlePausedJob yöntemi aşağıda açıklanmıştır.)

// Check for possible trouble states of a print job using its properties
static void SpotTroubleUsingProperties (PrintSystemJobInfo^ theJob) 
{
   if (theJob->IsBlocked)
   {
      Console::WriteLine("The job is blocked.");
   }
   if (theJob->IsCompleted || theJob->IsPrinted)
   {
      Console::WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.");
   }
   if (theJob->IsDeleted || theJob->IsDeleting)
   {
      Console::WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.");
   }
   if (theJob->IsInError)
   {
      Console::WriteLine("The job has errored.");
   }
   if (theJob->IsOffline)
   {
      Console::WriteLine("The printer is offline. Have user put it online with printer front panel.");
   }
   if (theJob->IsPaperOut)
   {
      Console::WriteLine("The printer is out of paper of the size required by the job. Have user add paper.");
   }

   if (theJob->IsPaused || theJob->HostingPrintQueue->IsPaused)
   {
      HandlePausedJob(theJob);
      //HandlePausedJob is defined in the complete example.
   }

   if (theJob->IsPrinting)
   {
      Console::WriteLine("The job is printing now.");
   }
   if (theJob->IsSpooling)
   {
      Console::WriteLine("The job is spooling now.");
   }
   if (theJob->IsUserInterventionRequired)
   {
      Console::WriteLine("The printer needs human intervention.");
   }
};
// Check for possible trouble states of a print job using its properties
internal static void SpotTroubleUsingProperties(PrintSystemJobInfo theJob)
{
    if (theJob.IsBlocked)
    {
        Console.WriteLine("The job is blocked.");
    }
    if (theJob.IsCompleted || theJob.IsPrinted)
    {
        Console.WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.");
    }
    if (theJob.IsDeleted || theJob.IsDeleting)
    {
        Console.WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.");
    }
    if (theJob.IsInError)
    {
        Console.WriteLine("The job has errored.");
    }
    if (theJob.IsOffline)
    {
        Console.WriteLine("The printer is offline. Have user put it online with printer front panel.");
    }
    if (theJob.IsPaperOut)
    {
        Console.WriteLine("The printer is out of paper of the size required by the job. Have user add paper.");
    }

    if (theJob.IsPaused || theJob.HostingPrintQueue.IsPaused)
    {
        HandlePausedJob(theJob);
        //HandlePausedJob is defined in the complete example.
    }

    if (theJob.IsPrinting)
    {
        Console.WriteLine("The job is printing now.");
    }
    if (theJob.IsSpooling)
    {
        Console.WriteLine("The job is spooling now.");
    }
    if (theJob.IsUserInterventionRequired)
    {
        Console.WriteLine("The printer needs human intervention.");
    }
}//end SpotTroubleUsingProperties
' Check for possible trouble states of a print job using its properties
Friend Shared Sub SpotTroubleUsingProperties(ByVal theJob As PrintSystemJobInfo)
    If theJob.IsBlocked Then
        Console.WriteLine("The job is blocked.")
    End If
    If theJob.IsCompleted OrElse theJob.IsPrinted Then
        Console.WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.")
    End If
    If theJob.IsDeleted OrElse theJob.IsDeleting Then
        Console.WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.")
    End If
    If theJob.IsInError Then
        Console.WriteLine("The job has errored.")
    End If
    If theJob.IsOffline Then
        Console.WriteLine("The printer is offline. Have user put it online with printer front panel.")
    End If
    If theJob.IsPaperOut Then
        Console.WriteLine("The printer is out of paper of the size required by the job. Have user add paper.")
    End If

    If theJob.IsPaused OrElse theJob.HostingPrintQueue.IsPaused Then
        HandlePausedJob(theJob)
        'HandlePausedJob is defined in the complete example.
    End If

    If theJob.IsPrinting Then
        Console.WriteLine("The job is printing now.")
    End If
    If theJob.IsSpooling Then
        Console.WriteLine("The job is spooling now.")
    End If
    If theJob.IsUserInterventionRequired Then
        Console.WriteLine("The printer needs human intervention.")
    End If

End Sub

HandlePausedJob yöntemi, uygulamanın kullanıcısının duraklatılan işleri uzaktan sürdürmesini sağlar. Yazdırma kuyruğunun duraklatılmış olmasının iyi bir nedeni olabileceğinden yöntem, kullanıcıdan devam edip etmemeye karar vermesini istemiyle başlar. Yanıt "Y" ise yöntemi PrintQueue.Resume çağrılır.

Ardından, yazdırma kuyruğundan bağımsız olarak duraklatılması durumunda, kullanıcının işin sürdürülmesi gerekip gerekmediğini belirlemesi istenir. (Karşılaştır PrintQueue.IsPaused ve PrintSystemJobInfo.IsPaused.) Yanıt "Y" ise çağrılır PrintSystemJobInfo.Resume ; aksi takdirde Cancel çağrılır.

static void HandlePausedJob (PrintSystemJobInfo^ theJob) 
{
   // If there's no good reason for the queue to be paused, resume it and 
   // give user choice to resume or cancel the job.
   Console::WriteLine("The user or someone with administrative rights to the queue" + "\nhas paused the job or queue." + "\nResume the queue? (Has no effect if queue is not paused.)" + "\nEnter \"Y\" to resume, otherwise press return: ");
   String^ resume = Console::ReadLine();
   if (resume == "Y")
   {
      theJob->HostingPrintQueue->Resume();

      // It is possible the job is also paused. Find out how the user wants to handle that.
      Console::WriteLine("Does user want to resume print job or cancel it?" + "\nEnter \"Y\" to resume (any other key cancels the print job): ");
      String^ userDecision = Console::ReadLine();
      if (userDecision == "Y")
      {
         theJob->Resume();
      } else
      {
         theJob->Cancel();
      }
   }
};
internal static void HandlePausedJob(PrintSystemJobInfo theJob)
{
    // If there's no good reason for the queue to be paused, resume it and
    // give user choice to resume or cancel the job.
    Console.WriteLine("The user or someone with administrative rights to the queue" +
         "\nhas paused the job or queue." +
         "\nResume the queue? (Has no effect if queue is not paused.)" +
         "\nEnter \"Y\" to resume, otherwise press return: ");
    String resume = Console.ReadLine();
    if (resume == "Y")
    {
        theJob.HostingPrintQueue.Resume();

        // It is possible the job is also paused. Find out how the user wants to handle that.
        Console.WriteLine("Does user want to resume print job or cancel it?" +
            "\nEnter \"Y\" to resume (any other key cancels the print job): ");
        String userDecision = Console.ReadLine();
        if (userDecision == "Y")
        {
            theJob.Resume();
        }
        else
        {
            theJob.Cancel();
        }
    }//end if the queue should be resumed
}//end HandlePausedJob
Friend Shared Sub HandlePausedJob(ByVal theJob As PrintSystemJobInfo)
    ' If there's no good reason for the queue to be paused, resume it and 
    ' give user choice to resume or cancel the job.
    Console.WriteLine("The user or someone with administrative rights to the queue" & vbLf & "has paused the job or queue." & vbLf & "Resume the queue? (Has no effect if queue is not paused.)" & vbLf & "Enter ""Y"" to resume, otherwise press return: ")
    Dim [resume] As String = Console.ReadLine()
    If [resume] = "Y" Then
        theJob.HostingPrintQueue.Resume()

        ' It is possible the job is also paused. Find out how the user wants to handle that.
        Console.WriteLine("Does user want to resume print job or cancel it?" & vbLf & "Enter ""Y"" to resume (any other key cancels the print job): ")
        Dim userDecision As String = Console.ReadLine()
        If userDecision = "Y" Then
            theJob.Resume()
        Else
            theJob.Cancel()
        End If
    End If 'end if the queue should be resumed

End Sub

Ayrıca bkz.