Здравствуйте!
Разбираясь с жалобой пользователя на зависание Civil 3D из-за моего приложения, обнаружил неприятную особенность срабатывания в нем события DocumentActivationChanged. Для тестов написал вот такой код:
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
namespace AcadTest
{
public class DocumentActivationTest
{
static ulong count = 0;
static bool launched = false;
[CommandMethod("RunDocActivateTest")]
public void Run()
{
DocumentCollection docMgr = Application.DocumentManager;
if (!launched)
{
docMgr.DocumentActivationChanged += docMgr_DocumentActivationChanged;
launched = true;
}
}
[CommandMethod("StopDocActivateTest")]
public void Stop()
{
DocumentCollection docMgr = Application.DocumentManager;
if (launched)
{
docMgr.DocumentActivationChanged -= docMgr_DocumentActivationChanged;
launched = false;
}
}
[CommandMethod("DocActivateCounterReset")]
public void CounterReset()
{
count = 0;
}
[CommandMethod("DocActivateCountShow")]
public void CounterShow()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("\nDocumentActivationChanged events: {0}", count);
}
void docMgr_DocumentActivationChanged(object sender, DocumentActivationChangedEventArgs e)
{
count++;
}
}
}
Его работу проверил в голом AutoCAD и в Civil 3D. По идее, разницы быть не должно, но она есть! Причем, очень ощутимая.
Вот видеоотчет по тестированию.
AutoCAD:
https://screencast.autodesk.com/main/details/41db8829-5277-4d90-89be-c4c054824d86Civil 3D:
https://screencast.autodesk.com/Main/Details/3c90c294-7183-4331-9100-a7c380f55b5eПолучается, что в Civil 3D событие активации документа происходит гораздо чаще! Причем, даже тогда, когда его не должно быть. В видео показан пример - вызов контекстного меню, когда есть выбранные в чертеже объекты. В примере всего несколько объектов, в реальном чертеже у нас их несколько сотен тысяч. А так как у меня происходит некоторая обработка этого события, которая занимает доли секунды, в сумме получается колоссальное зависание (я минут 10 ждал, потом просто завершил процесс acad.exe из диспетчера задач Windows).
Есть, правда, подозрение, что это какое-то мое другое приложение шалит. Поэтому, если у кого-то есть возможность - прошу проверить повторится ли эта ситуация у вас.
Спасибо.