Практическое руководство. Определение возможности печати в заданное время суток
Очереди печати не всегда доступны для 24 часа в сутки. Они имеют свойства времени начала и окончания, которые могут устанавливаться отключив их в определенное время суток. Эту функцию можно, например, чтобы зарезервировать принтер для использования только определенным подразделением после 17: 00. Этот отдел будет иметь другой очереди обслуживания принтера от других отделов использовать. Устанавливается в очередь для других отделов станет недоступной после 17: 00, то время как очередь для привилегированного отдела может быть быть доступна в любое время.
Кроме того задания печати, сами можно задать для печати только в указанный промежуток времени.
PrintQueue И PrintSystemJobInfo классы представлены в API платформы Microsoft .NET Framework предоставляют средства для удаленной проверки, можно ли печати данного задания печати из данной очереди в настоящее время.
Пример
В приведенном ниже примере приведен пример, можно диагностировать проблемы с заданием печати.
Существует два основных действия для этого вида функции следующим образом.
Чтение StartTimeOfDay и UntilTimeOfDay свойства PrintQueue для определения, является ли текущее время между ними.
Чтение StartTimeOfDay и UntilTimeOfDay свойства PrintSystemJobInfo для определения, является ли текущее время между ними.
Сложности возникают потому, что эти свойства не являются DateTime объектов. Они представляют собой Int32 объекты, представляющие время суток, как количество минут после полуночи. Кроме того это не полночь в текущем часовом поясе, но полуночи в формате UTC (время по Гринвичу).
В первом примере кода представлен статический метод ReportQueueAndJobAvailability, который передается PrintSystemJobInfo и вызывает вспомогательные методы для определения, является ли принтер может начать печать в настоящее время и, если нет, когда можно напечатать. Обратите внимание, что PrintQueue не передается в метод. Это обусловлено PrintSystemJobInfo включает ссылку на очередь в его HostingPrintQueue свойство.
Подчиненные методы включают перегруженных ReportAvailabilityAtThisTime метод, который может принимать либо PrintQueue или PrintSystemJobInfo как параметр. Имеется также TimeConverter.ConvertToLocalHumanReadableTime. Все эти методы описаны ниже.
ReportQueueAndJobAvailability метод начинает с проверки, если очереди или задания печати недоступен в данный момент. Если любой из них недоступен, он затем проверяет доступность очереди. Если она недоступна, метод сообщает, этот факт и время, когда очередь снова станут доступны. Затем он проверяет, задания и если он недоступен, он сообщает в следующий раз span, когда при печати. Наконец метод сообщает самое раннее время, когда принтер может начать печать. Это наиболее поздняя из следующих двух раз.
Время, когда очередь печати Далее доступна.
Время, когда задание печати Далее будет доступен.
При создании отчетов время суток, 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
Две перегруженные версии ReportAvailabilityAtThisTime метод идентичны, за исключением типа, переданные им, поэтому только PrintQueue версии представлена ниже.
Note
Тот факт, что методы идентичны за исключением типа возникает вопрос, почему в этом образце создаются универсального метода ReportAvailabilityAtThisTime<T >. Причина заключается в том, что такой метод пришлось бы быть ограничен классом, имеющим StartTimeOfDay и UntilTimeOfDay только можно ограничить свойства, которые вызывает метод, но универсальный метод один класс и единственным классом, общие для обоих PrintQueue и PrintSystemJobInfo в наследовании дерево является PrintSystemObject которого не имеет таких свойств.
ReportAvailabilityAtThisTime метод (представленный в следующем примере кода) начинается с инициализации Boolean sentinel переменной true
. Оно будет сброшено к false
, если очередь не доступна.
Затем метод проверяет, если начало и «until» раз идентичны. Если Да, очередь доступна всегда, поэтому этот метод возвращает true
.
Если очередь не доступны постоянно, данный метод использует статический UtcNow свойство для получения текущего времени в формате DateTime объекта. (Мы не требуется местное время, поскольку StartTimeOfDay и UntilTimeOfDay сами являются свойства в формате UTC.)
Тем не менее, эти два свойства ничем не DateTime объектов. Они являются Int32задающими время как количество минут после полуночи в формате UTC. Поэтому нам придется преобразовать наш DateTime объект минут после полуночи. Когда это будет сделано, метод просто проверяет ли «сейчас» между начала очереди, а также время, устанавливает флаг в значение false, если «сейчас» не между двумя значениями времени и возвращает этот флаг «до».
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
TimeConverter.ConvertToLocalHumanReadableTime (представленный в следующем примере кода) метод не использует все методы, появившиеся в Microsoft .NET Framework, поэтому краткое обсуждение. Этот метод имеет задачу двойного преобразования: оно должно принимать целое число минут после полуночи в формате выражения и преобразовать его в удобное для восприятия времени, и его необходимо преобразовать в местное время. Он делает это, сначала создавая DateTime объект, который устанавливается значение полуночи в формате UTC, а затем использует AddMinutes метод, чтобы добавить минуты, которые были переданы в метод. Эта команда возвращает новый DateTime содержащий исходное время, который был передан в метод. ToLocalTime Метод затем преобразует это в местное время.
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