Win2D API случайным образом завершается с ошибкой «Объекты, используемые вместе, должны создаваться из одного экземпляра фабрики». - PullRequest
0 голосов
/ 21 января 2020

Я пишу приложение UWP с широким использованием API-интерфейсов Win2D.

Иногда, без определенного шаблона или возможности систематического воспроизведения поведения, возникает незамеченное исключение типа System.Exception {System. Runtime.InteropServices.COMException} вызывается платформой без трассировки стека и только следующего сообщения:

Error HRESULT E_FAIL has been returned from a call to a COM component.

и чуть более полезного описания

Objects used together must be created from the same factory instance.

Поскольку нет трассировка стека, я не могу понять, что является причиной такого исключения, ни кусок кода, который его производит.

Согласно описанию, я пытался использовать одну фабрику для каждой операции Win2D, и, в частности, я собрал в 3 переменных c stati c фабрики, которые я использую:

public static class Win2DUtils
{
    public static readonly Compositor Compositor = Window.Current.Compositor;
    public static readonly CanvasDevice CanvasDev = CanvasDevice.GetSharedDevice();
    public static readonly CompositionGraphicsDevice GraphicsDevice = CanvasComposition.CreateCompositionGraphicsDevice(Compositor, CanvasDev);
}

Даже с этим escamotage, я все еще испытываю проблему.

Я также пытался в Visual Studio пометить все возможные исключения, чтобы остановить выполнение, когда они вызваны, но если с этим параметром исключение полностью не пойман и может быть воспринят только благодаря встроенной обработке исключений Visual Studio в режиме отладки (код в App.gics, который автоматически добавляется скаффолдингом Visual Studio в каждый проект UWP, что-то вроде:

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException += (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
#endif

Кто-нибудь знает о том, что может быть возможной причиной и, по крайней мере, как найти источник исключения?

Большое спасибо

cghersi

1 Ответ

0 голосов
/ 30 января 2020

Я наконец решил проблему (по-видимому), поэтому я публикую для всех, кто сталкивается с той же проблемой.

В нашем коде мы создаем экземпляр CanvasAnimatedControl для рисования чернил.

По умолчанию конструктор publi c без параметров CanvasAnimatedControl устанавливает флаг UseSharedDevice в значение false, что позволяет CanvasAnimatedControl создавать свои собственные CanvasDevice.

Создание холста как:

aniCanvas = new CanvasAnimatedControl()
{
    UseSharedDevice = true
};

решил проблему, и исключение больше не появляется.

...