На первый взгляд быстро, но когда нужно прочесть 1000 таких записей получается, что пользователь должен ждать уже 8 сек.
Ключевое слово здесь (когда нужно прочесть 1000 таких записей). Когда есть циклы, особенно вложенные смотри в первую очередь на циклы!
Твоя функция создана универсальной для чтения одиночной записи , а не 1000 записей подряд.
скорее всего незачем вызывать 1000 раз подряд:
- блокировку документа,
- открытие закрытие транзакции
- получение NamedObjectsDictionary
это и нужно оптимизировать в первую очередь.
Не знаю до конца твоей задачи, сколько database, DBDictionary и Xrecord. Откуда беруться database. Для одной database примерно так.
private void ReadAllData()
{
Document document = Cad.DocumentManager.MdiActiveDocument;
DocumentLock documentLock = document.LockDocument();
Database db = HostApplicationServices.WorkingDatabase;
Transaction tr = database.TransactionManager.StartTransaction();
DBDictionary namedObjectsDictionary = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
foreach (string dictName in dictNameArray)
{
if (namedObjectsDictionary.Contains(dictName))
{
DBDictionary CurrDict = (DBDictionary)tr.GetObject(namedObjectsDictionary.GetAt(dictName), OpenMode.ForRead, false);
foreach (string keyRec in keyNameArray)
{
string retS = acadnet_xrecord_Get_String(dictName, keyRec, tr, CurrDict);
}
}
}
transaction.Commit();
transaction.Dispose();
documentLock.Dispose();
}
private string acadnet_xrecord_Get_String(string dictName, string keyRec, Transaction tr, DBDictionary CurrDict)
{
string retS = "";
if (CurrDict.Contains(keyRec))
{
Xrecord xrec = (Xrecord)tr.GetObject(CurrDict.GetAt(keyRec), OpenMode.ForRead, false);
retS = xrec.Data.AsArray()[0].Value.ToString();
}
return retS;
}
using Transaction, проверки try или !=null допилить не долго ;-)