Я работаю с принтерами, и мне нужно общее имя принтера
подход 1
string query = String.Format("SELECT * FROM Win32_Printer WHERE Name = '{0}'", PrinterName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection collection = searcher.Get();
ManagementObject printer = collection.Cast<ManagementObject>().ElementAt(0);
sharedName = printer.Properties["ShareName"].Value.ToString();
, и проблема с нимесли у вас есть общий принтер, такой как PrinterName="\\IN01RD09\ZDesigner GX420t"
, тогда я ничего не получу в collection
, если его локальный принтер PrinterName="ZDesigner GX420t"
работает нормально, поэтому
подход 2
var printerQuery = new ManagementObjectSearcher("SELECT * from Win32_Printer");
foreach (var printer in printerQuery.Get())
{
var name = printer.GetPropertyValue("Name");
if (name.ToString().Equals(printerName))
{
sharedName = printer.GetPropertyValue("ShareName").ToString();
break;
}
}
Работает нормально для обоих случаев, но если у меня так много принтеров, время выполнения составляет около минуты
, поэтому мне нужно минимизировать время или получить подход к работе 1, я тоже решил использовать потоки, я сохранюэтот вариант, если у меня нет решения, любая помощь будет оценена спасибо