HWA: создание экземпляра RenderTargetBitmap создает RPC_E_WRONG_THREAD даже в потоке пользовательского интерфейса - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать RenderTargetBitmap, чтобы получить скриншот окна Windows Hosted Web App (HWA), но я не могу создать его экземпляр при обработке запроса от веб-приложения Javascript, запущенного в приложении HWA:

public async Task<IBuffer> CaptureScreenshotToFileAsync(uint thumbnailWidth, uint thumbnailHeight, string fileName)
{
    // Throws RPC_E_WRONG_THREAD
    RenderTargetBitmap screenshotBitmap = new RenderTargetBitmap();

    // Assumed that this was a background thread, but...
    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        // Surprisingly same thread as above, naturally also throws RPC_E_WRONG_THREAD
        RenderTargetBitmap screenshotBitmap = new RenderTargetBitmap();            
    });
}

В обоих случаях это выбрасывается:

System.Exception: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E    (RPC_E_WRONG_THREAD))
       at Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap..ctor()

Кстати, если я делаю следующее из фонового потока в стандартном приложении UWP, он работает как положено:

public MainPage()
{
    // UI thread

    Task.Run(() => {
        // Background thread
        await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
        {
            // Back in UI thread.
            RenderTargetBitmap targetBitmap = new RenderTargetBitmap(); // doesn't throw.
        }
    });
}

Кто-нибудь может объяснить:

  • Почему не удается создать экземпляр RenderTargetBitmap в потоке "UI" в приложении HWA?
  • Почемувеб-запрос от Javascript обрабатывается потоком "UI" приложения HWA (бонус)?
...