Procedura: individuare se è possibile eseguire o meno un processo di stampa all'orario indicatoHow to: Discover Whether a Print Job Can Be Printed At This Time of Day

Code di stampa non sono sempre disponibili per 24 ore al giorno.Print queues are not always available for 24 hours a day. Hanno proprietà ora di inizio e fine che è possibile impostare per renderli disponibili in determinati orari del giorno.They have start and end time properties that can be set to make them unavailable at certain times of day. Questa funzionalità è utilizzabile, ad esempio, per riservare una stampante per l'utilizzo esclusivo di un determinato reparto dopo le 17.00.This feature can be used, for example, to reserve a printer for the exclusive use of a certain department after 5 P.M.. Tale reparto avrebbe una coda diversa per la manutenzione della stampante di altri reparti utilizzare.That department would have a different queue servicing the printer than other departments use. La coda per gli altri reparti verrebbe impostata per essere disponibile dopo le 17.00, mentre coda quella per il reparto può essere impostata per essere sempre disponibile.The queue for the other departments would be set to be unavailable after 5 P.M., while queue for the favored department could be set to be available at all times.

Inoltre, è possono impostare i processi di stampa se stessi come printable solo all'interno di un intervallo di tempo specificato.Moreover, print jobs themselves can be set to be printable only within a specified span of time.

Il PrintQueue e PrintSystemJobInfo classi esposti nel APIAPIs di Microsoft .NET Framework forniscono un mezzo per controllare in modalità remota se un processo di stampato specificato può essere eseguito su una determinata coda al momento corrente.The PrintQueue and PrintSystemJobInfo classes exposed in the APIAPIs of Microsoft .NET Framework provide a means for remotely checking whether a given print job can print on a given queue at the current time.

EsempioExample

Nell'esempio riportato di seguito è riportato un esempio che è possibile diagnosticare i problemi di un processo di stampa.The example below is a sample that can diagnose problems with a print job.

Esistono due passaggi principali per questo tipo di funzione come indicato di seguito.There are two major steps for this kind of function as follows.

  1. Lettura di StartTimeOfDay e UntilTimeOfDay le proprietà del PrintQueue per determinare se l'ora corrente è tra di essi.Read the StartTimeOfDay and UntilTimeOfDay properties of the PrintQueue to determine whether the current time is between them.

  2. Lettura di StartTimeOfDay e UntilTimeOfDay le proprietà del PrintSystemJobInfo per determinare se l'ora corrente è tra di essi.Read the StartTimeOfDay and UntilTimeOfDay properties of the PrintSystemJobInfo to determine whether the current time is between them.

Tuttavia verificano complicazioni dal fatto che queste proprietà non sono DateTime oggetti.But complications arise from the fact that these properties are not DateTime objects. Sono invece Int32 oggetti che esprimono l'ora del giorno come il numero di minuti trascorsi dalla mezzanotte.Instead they are Int32 objects that express the time of day as the number of minutes since midnight. Inoltre, non si tratta mezzanotte nel fuso orario corrente, ma la mezzanotte ora UTC (Coordinated Universal Time).Moreover, this is not midnight in the current time zone, but midnight UTC (Coordinated Universal Time).

Il primo esempio di codice presenta il metodo statico ReportQueueAndJobAvailability, che viene passato un PrintSystemJobInfo e chiama i metodi helper per determinare se il processo può essere stampato all'ora corrente e, se non, quando è possibile stampare.The first code example presents the static method ReportQueueAndJobAvailability, which is passed a PrintSystemJobInfo and calls helper methods to determine whether the job can print at the current time and, if not, when it can print. Si noti che un PrintQueue non viene passato al metodo.Notice that a PrintQueue is not passed to the method. In questo modo il PrintSystemJobInfo include un riferimento alla coda nel relativo HostingPrintQueue proprietà.This is because the PrintSystemJobInfo includes a reference to the queue in its HostingPrintQueue property.

I metodi subordinati includono il metodo di overload ReportAvailabilityAtThisTime metodo che può accettare un PrintQueue o PrintSystemJobInfo come parametro.The subordinate methods include the overloaded ReportAvailabilityAtThisTime method which can take either a PrintQueue or a PrintSystemJobInfo as a parameter. È inoltre disponibile un TimeConverter.There is also a TimeConverter.ConvertToLocalHumanReadableTime. Tutti questi metodi sono descritti di seguito.All of these methods are discussed below.

Il ReportQueueAndJobAvailability metodo inizia con un controllo per verificare se la coda o il processo di stampa non è disponibile in questo momento.The ReportQueueAndJobAvailability method begins by checking to see if either the queue or the print job is unavailable at this time. Se nessuno dei due non è disponibile, viene quindi verificato se la coda non disponibile.If either of them is unavailable, it then checks to see if the queue unavailable. Se non è disponibile, il metodo segnala tale situazione e il tempo quando la coda sarà nuovamente disponibile.If it is not available, then the method reports this fact and the time when the queue will become available again. Verifica quindi il processo e se non è disponibile, viene segnalato al successivo quando span quando è possibile stampare.It then checks the job and if it is unavailable, it reports the next time span when it when it can print. Infine, il metodo segnala l'ora meno recente quando il processo è possibile stampare.Finally, the method reports the earliest time when the job can print. Si tratta della seconda dei seguenti due volte.This is the later of following two times.

  • Ora quando la coda di stampa è successivamente disponibile.The time when the print queue is next available.

  • Ora quando il processo di stampa è disponibile.The time when the print job is next available.

Quando si segnalano ore del giorno, il ToShortTimeString metodo viene chiamato anche il metodo che elimina l'anni, mesi e giorni dall'output.When reporting times of day, the ToShortTimeString method is also called because this method suppresses the years, months, and days from the output. In particolari anni, mesi o giorni, è possibile limitare la disponibilità di una coda di stampa o un processo di stampa.You cannot restrict the availability of either a print queue or a print job to particular years, months, or days.

static void ReportQueueAndJobAvailability (PrintSystemJobInfo^ theJob) 
{
   if (!(ReportAvailabilityAtThisTime(theJob->HostingPrintQueue) && ReportAvailabilityAtThisTime(theJob)))
   {
      if (!ReportAvailabilityAtThisTime(theJob->HostingPrintQueue))
      {
         Console::WriteLine("\nThat queue is not available at this time of day." + "\nJobs in the queue will start printing again at {0}", TimeConverter::ConvertToLocalHumanReadableTime(theJob->HostingPrintQueue->StartTimeOfDay).ToShortTimeString());
         // TimeConverter class is defined in the complete sample
      }
      if (!ReportAvailabilityAtThisTime(theJob))
      {
         Console::WriteLine("\nThat job is set to print only between {0} and {1}", TimeConverter::ConvertToLocalHumanReadableTime(theJob->StartTimeOfDay).ToShortTimeString(), TimeConverter::ConvertToLocalHumanReadableTime(theJob->UntilTimeOfDay).ToShortTimeString());
      }
      Console::WriteLine("\nThe job will begin printing as soon as it reaches the top of the queue after:");
      if (theJob->StartTimeOfDay > theJob->HostingPrintQueue->StartTimeOfDay)
      {
         Console::WriteLine(TimeConverter::ConvertToLocalHumanReadableTime(theJob->StartTimeOfDay).ToShortTimeString());
      } else
      {
         Console::WriteLine(TimeConverter::ConvertToLocalHumanReadableTime(theJob->HostingPrintQueue->StartTimeOfDay).ToShortTimeString());
      }

   }
};
internal static void ReportQueueAndJobAvailability(PrintSystemJobInfo theJob)
{
    if (!(ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) && ReportAvailabilityAtThisTime(theJob)))
    {
        if (!ReportAvailabilityAtThisTime(theJob.HostingPrintQueue))
        {
            Console.WriteLine("\nThat queue is not available at this time of day." +
                "\nJobs in the queue will start printing again at {0}",
                 TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString());
            // TimeConverter class is defined in the complete sample
        }

        if (!ReportAvailabilityAtThisTime(theJob))
        {
            Console.WriteLine("\nThat job is set to print only between {0} and {1}",
                TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString(),
                TimeConverter.ConvertToLocalHumanReadableTime(theJob.UntilTimeOfDay).ToShortTimeString());
        }
        Console.WriteLine("\nThe job will begin printing as soon as it reaches the top of the queue after:");
        if (theJob.StartTimeOfDay > theJob.HostingPrintQueue.StartTimeOfDay)
        {
            Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString());
        }
        else
        {
            Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString());
        }

    }//end if at least one is not available

}//end ReportQueueAndJobAvailability
Friend Shared Sub ReportQueueAndJobAvailability(ByVal theJob As PrintSystemJobInfo)
	If Not(ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) AndAlso ReportAvailabilityAtThisTime(theJob)) Then
		If Not ReportAvailabilityAtThisTime(theJob.HostingPrintQueue) Then
			Console.WriteLine(vbLf & "That queue is not available at this time of day." & vbLf & "Jobs in the queue will start printing again at {0}", TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString())
			' TimeConverter class is defined in the complete sample
		End If

		If Not ReportAvailabilityAtThisTime(theJob) Then
			Console.WriteLine(vbLf & "That job is set to print only between {0} and {1}", TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString(), TimeConverter.ConvertToLocalHumanReadableTime(theJob.UntilTimeOfDay).ToShortTimeString())
		End If
		Console.WriteLine(vbLf & "The job will begin printing as soon as it reaches the top of the queue after:")
		If theJob.StartTimeOfDay > theJob.HostingPrintQueue.StartTimeOfDay Then
			Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.StartTimeOfDay).ToShortTimeString())
		Else
			Console.WriteLine(TimeConverter.ConvertToLocalHumanReadableTime(theJob.HostingPrintQueue.StartTimeOfDay).ToShortTimeString())
		End If

	End If 'end if at least one is not available

End Sub 'end ReportQueueAndJobAvailability

I due overload del ReportAvailabilityAtThisTime metodo sono identiche ad eccezione del tipo passato a essi in modo che solo il PrintQueue versione viene presentata di seguito.The two overloads of the ReportAvailabilityAtThisTime method are identical except for the type passed to them, so only the PrintQueue version is presented below.

Nota

Il fatto che i metodi sono identici ad eccezione di tipo genera alla domanda perché il codice di esempio non crea un metodo generico ReportAvailabilityAtThisTime<T >.The fact that the methods are identical except for type raises the question of why the sample does not create a generic method ReportAvailabilityAtThisTime<T>. Il motivo è che tale metodo deve essere limitato a una classe che ha il StartTimeOfDay e UntilTimeOfDay proprietà che chiama il metodo, ma un metodo generico può essere limitato a un singola classe e l'unica classe comune a entrambi PrintQueue e PrintSystemJobInfo nell'ereditarietà a struttura ad albero è PrintSystemObject che non dispone di tali proprietà.The reason is that such a method would have to be restricted to a class that has the StartTimeOfDay and UntilTimeOfDay properties that the method calls, but a generic method can only be restricted to a single class and the only class common to both PrintQueue and PrintSystemJobInfo in the inheritance tree is PrintSystemObject which has no such properties.

Il ReportAvailabilityAtThisTime metodo, come illustrato nell'esempio di codice riportato di seguito, avvia l'inizializzazione di un Boolean variabile sentinel per true.The ReportAvailabilityAtThisTime method (presented in the code example below) begins by initializing a Boolean sentinel variable to true. Verranno ripristinata false, se la coda non è disponibile.It will be reset to false, if the queue is not available.

Successivamente, il metodo controlla se l'inizio e "fino a quando non" volte identico.Next, the method checks to see if the start and "until" times are identical. In tal caso, la coda è sempre disponibile, il metodo restituisce true.If they are, the queue is always available, so the method returns true.

Se la coda non è disponibile tutto il tempo, il metodo utilizza il metodo statico UtcNow proprietà da ottenere l'ora corrente come un DateTime oggetto.If the queue is not available all the time, the method uses the static UtcNow property to get the current time as a DateTime object. (Ora locale non è necessaria perché il StartTimeOfDay e UntilTimeOfDay sono in formato ora UTC.)(We do not need local time because the StartTimeOfDay and UntilTimeOfDay properties are themselves in UTC time.)

Tuttavia, queste due proprietà non sono DateTime oggetti.However, these two properties are not DateTime objects. Sono Int32s esprime l'ora come numero di minuti dopo la mezzanotte ora UTC.They are Int32s expressing the time as the number of minutes-after-UTC-midnight. Pertanto è necessario convertire il nostro DateTime oggetto minuti trascorsi dalla mezzanotte.So we do have to convert our DateTime object to minutes-after-midnight. Una volta effettuata questa operazione, il metodo controlla semplicemente per verificare se "ora" sia tra l'inizio della coda e "volte, imposta sentinel su false se"ora"non è compreso tra due volte e restituisce sentinel fino a".When that is done, the method simply checks to see whether "now" is between the queue's start and "until" times, sets the sentinel to false if "now" is not between the two times, and returns the sentinel.

static Boolean ReportAvailabilityAtThisTime (PrintQueue^ pq) 
{
   Boolean available = true;
   if (pq->StartTimeOfDay != pq->UntilTimeOfDay)
   {
      DateTime utcNow = DateTime::UtcNow;
      Int32 utcNowAsMinutesAfterMidnight = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes;

      // If now is not within the range of available times . . .
      if (!((pq->StartTimeOfDay < utcNowAsMinutesAfterMidnight) && (utcNowAsMinutesAfterMidnight < pq->UntilTimeOfDay)))
      {
         available = false;
      }
   }
   return available;
};
private static Boolean ReportAvailabilityAtThisTime(PrintQueue pq)
{
    Boolean available = true;
    if (pq.StartTimeOfDay != pq.UntilTimeOfDay) // If the printer is not available 24 hours a day
    {
        DateTime utcNow = DateTime.UtcNow;
        Int32 utcNowAsMinutesAfterMidnight = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes;

        // If now is not within the range of available times . . .
        if (!((pq.StartTimeOfDay < utcNowAsMinutesAfterMidnight) 
           && 
           (utcNowAsMinutesAfterMidnight < pq.UntilTimeOfDay)))
        {
            available = false;
        }
    }
    return available;
}//end ReportAvailabilityAtThisTime
Private Shared Function ReportAvailabilityAtThisTime(ByVal pq As PrintQueue) As Boolean
	Dim available As Boolean = True
	If pq.StartTimeOfDay <> pq.UntilTimeOfDay Then ' If the printer is not available 24 hours a day
		Dim utcNow As Date = Date.UtcNow
		Dim utcNowAsMinutesAfterMidnight As Int32 = (utcNow.TimeOfDay.Hours * 60) + utcNow.TimeOfDay.Minutes

		' If now is not within the range of available times . . .
		If Not((pq.StartTimeOfDay < utcNowAsMinutesAfterMidnight) AndAlso (utcNowAsMinutesAfterMidnight < pq.UntilTimeOfDay)) Then
			available = False
		End If
	End If
	Return available
End Function 'end ReportAvailabilityAtThisTime

Il TimeConverter (presentata nell'esempio di codice riportato di seguito) metodo non usa metodi introdotti con Microsoft .NET Framework, pertanto la discussione è breve.The TimeConverter.ConvertToLocalHumanReadableTime method (presented in the code example below) does not use any methods introduced with Microsoft .NET Framework, so the discussion is brief. Il metodo ha un'attività di conversione doppie: deve accettare un numero intero che esprime minuti dopo la mezzanotte e convertirlo in un momento leggibile e questo deve convertire l'ora locale.The method has a double conversion task: it must take an integer expressing minutes-after-midnight and convert it to a human-readable time and it must convert this to the local time. Esegue questa operazione creando innanzitutto un DateTime oggetto che viene impostato sulla mezzanotte ora UTC, quindi viene utilizzato il AddMinutes metodo per aggiungere i minuti che sono stati passati al metodo.It accomplishes this by first creating a DateTime object that is set to midnight UTC and then it uses the AddMinutes method to add the minutes that were passed to the method. Restituisce un nuovo DateTime esprime l'ora originale è stato passato al metodo.This returns a new DateTime expressing the original time that was passed to the method. Il ToLocalTime metodo converte quindi l'ora locale.The ToLocalTime method then converts this to local time.

private ref class TimeConverter {

internal: 
   static DateTime ConvertToLocalHumanReadableTime (Int32 timeInMinutesAfterUTCMidnight) 
   {
      // Construct a UTC midnight object.
      // Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
      DateTime utcNow = DateTime::UtcNow;
      DateTime utcMidnight = DateTime(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind::Utc);

      // Add the minutes passed into the method in order to get the intended UTC time.
      Double minutesAfterUTCMidnight = ((Double)timeInMinutesAfterUTCMidnight);
      DateTime utcTime = utcMidnight.AddMinutes(minutesAfterUTCMidnight);

      // Convert to local time.
      DateTime localTime = utcTime.ToLocalTime();

      return localTime;
   };
};
class TimeConverter
{
    // Convert time as minutes past UTC midnight into human readable time in local time zone.
    internal static DateTime ConvertToLocalHumanReadableTime(Int32 timeInMinutesAfterUTCMidnight)
    {
        // Construct a UTC midnight object.
        // Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
        DateTime utcNow = DateTime.UtcNow; 
        DateTime utcMidnight = new DateTime(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind.Utc);
        
        // Add the minutes passed into the method in order to get the intended UTC time.
        Double minutesAfterUTCMidnight = (Double)timeInMinutesAfterUTCMidnight;
        DateTime utcTime = utcMidnight.AddMinutes(minutesAfterUTCMidnight);
        
        // Convert to local time.
        DateTime localTime = utcTime.ToLocalTime();

        return localTime;

    }// end ConvertToLocalHumanReadableTime

}//end TimeConverter class
Friend Class TimeConverter
	' Convert time as minutes past UTC midnight into human readable time in local time zone.
	Friend Shared Function ConvertToLocalHumanReadableTime(ByVal timeInMinutesAfterUTCMidnight As Int32) As Date
		' Construct a UTC midnight object.
		' Must start with current date so that the local Daylight Savings system, if any, will be taken into account.
		Dim utcNow As Date = Date.UtcNow
		Dim utcMidnight As New Date(utcNow.Year, utcNow.Month, utcNow.Day, 0, 0, 0, DateTimeKind.Utc)

		' Add the minutes passed into the method in order to get the intended UTC time.
		Dim minutesAfterUTCMidnight As Double = CType(timeInMinutesAfterUTCMidnight, Double)
		Dim utcTime As Date = utcMidnight.AddMinutes(minutesAfterUTCMidnight)

		' Convert to local time.
		Dim localTime As Date = utcTime.ToLocalTime()

		Return localTime

	End Function ' end ConvertToLocalHumanReadableTime

End Class 'end TimeConverter class

Vedere ancheSee Also

DateTime
PrintSystemJobInfo
PrintQueue
Documenti in WPFDocuments in WPF
Panoramica della stampaPrinting Overview