【问题标题】:Instantiate WriteableImage in Background Task在后台任务中实例化 WriteableImage
【发布时间】:2016-06-20 22:04:34
【问题描述】:

我正在编写一个带有动态磁贴的 Windows 8 应用商店应用程序。每个动态磁贴都是需要每 x 分钟刷新一次的图像。我正在使用带有时间触发器的后台任务来生成我的图像并刷新磁贴。

生成我的图像意味着创建一个新图像并在其上绘制我的东西,但由于某种原因,我在尝试创建 WriteableBitmap 的新实例时遇到了异常:

var newImage = new Windows.UI.Xaml.Media.Imaging.WriteableBitmap(10, 10);

或

var newImage = BitmapFactory.New(10, 10);

抛出此异常:

应用程序调用了一个接口,该接口被编组为 不同的线程。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))

我的印象是因为后台任务中没有 UI 线程,但话说回来,为什么 WriteableBitmap 需要 UI 线程?

知道如何解决这个问题吗?如何在后台任务中实例化 WriteableBitmap?

【问题讨论】:

  • 好问题。我很想看到一个真正有效的答案。

标签: windows-8 windows-runtime


【解决方案1】:

事实证明这在 Windows 8 中是不可能的。

在后续版本 Win 8.1 和 UWP 中通过XamlBackgroundTask 实现了这一点

【讨论】:

    【解决方案2】:

    你可以使用Dispatcher

    Application.Current.Dispatcher.Invoke(
        DispatcherPriority.Normal,
        new Action(() => createBitmap)
    );
    

    更新

    Dispatcher.RunAsync
        (CoreDispatcherPriority.Normal, 
        () => new WriteableBitmap(10, 10));
    

    【讨论】:

    • 这可能适用于常规应用程序,但由于这是 WinRT 后台任务,因此没有可用的 Application.Current.Dispacher。你有一个工作代码 sn-p 被放置在 WinRT 中的后台任务的上下文中吗?
    • @Mayank 该代码也不起作用。 Dispatcher 指的是没有 RunAsync 方法的 ServiceModel.Dispatcher 或标准应用程序 Dispatcher。我遇到了同样的问题。
    【解决方案3】:

    您仍然可以使用以下代码:

     CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
                () =>{
                    // Your UI update code goes here!
                    WriteableBitmap writeableBmp = BitmapFactory.New(imageWidth, imageHeight);
                });
    

    但很可能你会得到另一个异常 (InvalidOperationException) 说: 在意外的时间调用了一个方法。 WinRT 信息:无法创建新视图,因为尚未创建主窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2015-03-23
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多