Открытие документа XPS в .NET вызывает утечку памяти

Я решил это! Во-первых: мне нужно было установить тайм-аут в package.json равным 10000 миллисекундам:

"test": "nyc mocha --require @babel/register --require @babel/polyfill tests/unit/**/*.test.js --timeout 10000"

Во-вторых: мне пришлось создать соединение с моей базой данных MongoDB (и, конечно же, отключиться после тестирования).

before(done =>{
    mongoose.connect('mongodb://localhost:27017/FindMates', {useNewUrlParser: true });
    mongoose.set('useCreateIndex', true);
    mongoose.set('useFindAndModify', false);
    done();
});
after(done => {
    mongoose.disconnect();
    done();
});

6
задан Joel Coehoorn 20 October 2008 в 15:10
поделиться

3 ответа

Ну, я нашел его. Это - ошибка в платформе, и работать вокруг этого Вы добавляете вызов к UpdateLayout. Используя оператор может быть изменен на следующее для обеспечения фиксации;

        Using XPSItem As New Windows.Xps.Packaging.XpsDocument(PathToTestXps, System.IO.FileAccess.Read)
            Dim FixedDocSequence As Windows.Documents.FixedDocumentSequence
            Dim DocPager As Windows.Documents.DocumentPaginator

            FixedDocSequence = XPSItem.GetFixedDocumentSequence
            DocPager = FixedDocSequence.DocumentPaginator
            DocPager.ComputePageCount()

            ' This is the fix, each page must be laid out otherwise resources are never released.'
            For PageIndex As Integer = 0 To DocPager.PageCount - 1
                DirectCast(DocPager.GetPage(PageIndex).Visual, Windows.Documents.FixedPage).UpdateLayout()
            Next
            FixedDocSequence = Nothing
        End Using
7
ответ дан 9 December 2019 в 20:51
поделиться

Я не могу дать Вам авторитетный совет, но у меня действительно было несколько мыслей:

  • Если Вы хотите наблюдать свою память в цикле, необходимо собирать память в цикле также. Иначе Вы, будет казаться, пропустите память дизайном, так как более эффективно собрать большие блоки менее часто (по мере необходимости), а не постоянно собирать небольшие количества. В этом случае блок объема, создающий оператор использования, должен быть достаточно, но Ваше использование GC.Collect указывает, что, возможно, что-то еще продолжается.
  • Даже GC.Collect является только предложением (хорошо, очень сильным предложением, но все еще предложением): это не гарантирует, что вся выдающаяся память собрана.
  • Если внутренний код XPS действительно пропускает память, единственный способ вынудить ОС собраться, это должно обмануть ОС в размышление, что приложение закончилось. Чтобы сделать это, Вы могли, возможно, создать фиктивное приложение, которое обрабатывает Ваш код xps и названо из главного приложения, или перемещение кода xps в свой собственный AppDomain в Вашем основном коде может быть достаточно также.
0
ответ дан 9 December 2019 в 20:51
поделиться

Заглянул в это сегодня. Интересно, что когда я изучал вещи с помощью Reflector.NET, я обнаружил, что исправление связано с вызовом UpdateLayout () в ContextLayoutManager, связанном с текущим Dispatcher.(читайте: нет необходимости перебирать страницы).

По сути, код, который нужно вызвать (используйте здесь отражение):

ContextLayoutManager.From(Dispatcher.CurrentDispatcher).UpdateLayout();

Определенно ощущается как небольшая оплошность со стороны MS.

Для ленивых или незнакомых этот код работает:

Assembly presentationCoreAssembly = Assembly.GetAssembly(typeof (System.Windows.UIElement));
Type contextLayoutManagerType = presentationCoreAssembly.GetType("System.Windows.ContextLayoutManager");
object contextLayoutManager = contextLayoutManagerType.InvokeMember("From",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, null, null, new[] {dispatcher});
contextLayoutManagerType.InvokeMember("UpdateLayout", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, contextLayoutManager, null);

FxCop будет жаловаться, но, возможно, это будет исправлено в следующей версии фреймворка. Код, опубликованный автором, кажется «более безопасным», если вы предпочитаете не использовать отражение.

HTH!

5
ответ дан 9 December 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: