C# 已封送XamlReader.Load()

C# 已封送XamlReader.Load(),c#,c++,xaml,windows-phone-8.1,C#,C++,Xaml,Windows Phone 8.1,我正在尝试从xaml生成自己的自定义磁贴。我已经把一些代码从C++转换成C语言,以便将它集成到我的应用程序中。 基本上我有这个方法: async Task GenerateHighResTileImage(string inputMarkupFilename, string outputImageFilename, Size size) { StorageFolder assetsFolder = await Package.Current.InstalledLocation.GetF

我正在尝试从xaml生成自己的自定义磁贴。我已经把一些代码从C++转换成C语言,以便将它集成到我的应用程序中。 基本上我有这个方法:

async Task GenerateHighResTileImage(string inputMarkupFilename, string outputImageFilename, Size size)
{
     StorageFolder assetsFolder = await Package.Current.InstalledLocation.GetFolderAsync("Assets");
     StorageFile markupStorageFile = await assetsFolder.GetFileAsync(inputMarkupFilename);
     string markupContent = await FileIO.ReadTextAsync(markupStorageFile);

     Border grid = (Border)XamlReader.Load(markupContent);
     await RenderAndSaveToFileAsync(grid, outputImageFilename, (int)size.Width, (int)size.Height);
}
调试器在我试图加载标记的行上停止,并说:

中发生了类型为“System.exception”的首次意外异常 BGTask.winmd

附加信息:应用程序调用的接口 为不同的线程编组。(HRESULT的异常:0x8001010E (RPC_E_错误_线程))

我的瓷砖非常普通,因为我只是在测试:

<Border Height="360" Width="360" Padding="12" BorderBrush="White" BorderThickness="4" CornerRadius="2" Background="#00b2f0" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
</Border>

当我在BackgroundTask之外运行代码时,代码也可以正常工作。如果您使用的是Silverlight,则需要从默认的dispatcher[
Deployment.Current.dispatcher.BeginInvoke(…)
]运行代码。如果你使用的是一个通用的应用程序,你需要从中获取,但是强烈建议你使用C++来避免内存不足。是
SyncronizationContext。当前的
在方法
GenerateHighResTileImage
的开始处不为null。我不确定,我将添加代码我不熟悉Windows Phone线程模型,但是,无论如何,如果您没有同步上下文,那么等待后的继续将被封送到线程池。检查方法开始时的
SyncronizationContext.Current
。这正是所需的全部。
task<void> AppTileUpdater::GenerateHighResTileImageUpdateAsync(String^ inputMarkupFilename, String^ outputImageFilename, Size size)
{
    return create_task(Package::Current->InstalledLocation->GetFolderAsync("Assets"))
        .then([inputMarkupFilename](StorageFolder^ assetsFolder) ->IAsyncOperation<StorageFile^>^ {
        return assetsFolder->GetFileAsync(inputMarkupFilename);
    }).then([](StorageFile^ markupStorageFile)  ->IAsyncOperation<Platform::String^>^ {
        return FileIO::ReadTextAsync(markupStorageFile);
    }).then([this, outputImageFilename, size](Platform::String^ markupContent){
          Border^ border = (Border^) XamlReader::Load(markupContent);

          return RenderAndSaveToFileAsync(border, outputImageFilename, (unsigned int) size.Width, (unsigned int) size.Height);
    });
}
async public void Run(IBackgroundTaskInstance taskInstance)
{
    var deferral = taskInstance.GetDeferral();
    taskInstance.Canceled += (s, e) => { };
    taskInstance.Progress = 0;

    await GenerateHighResTileImage("150x150Tile.xml", "updatedTile.png", new Size(150, 150));
    UpdateTile("updatedTile.png");

    deferral.Complete();

}