C# 使用ShareTarget第二个窗口中的代码编组异常

C# 使用ShareTarget第二个窗口中的代码编组异常,c#,xaml,windows-runtime,uwp,lumia-imaging-sdk,C#,Xaml,Windows Runtime,Uwp,Lumia Imaging Sdk,我的一些代码很难处理,当从ShareTarget合同创建的第二个窗口调用时(当您向应用程序共享某些内容时,它会在一个独立的小窗口中打开),这些代码显然很难处理 这是我目前的代码: // Blur and resize the image to get the average HSL color // Assume that stream is an IRandomAccessStream pointing to valid image data HslColor hslMean; using (

我的一些代码很难处理,当从ShareTarget合同创建的第二个窗口调用时(当您向应用程序共享某些内容时,它会在一个独立的小窗口中打开),这些代码显然很难处理

这是我目前的代码:

// Blur and resize the image to get the average HSL color
// Assume that stream is an IRandomAccessStream pointing to valid image data
HslColor hslMean;
using (RandomAccessStreamImageSource imageProvider = new RandomAccessStreamImageSource(stream))
using (BlurEffect blurEffect = new BlurEffect(imageProvider) { KernelSize = 256 })
{
    Color mean = await DispatcherHelper.GetFromUIThreadAsync(async () =>
    {
        WriteableBitmap
            blurred = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight),
            result = await blurEffect.GetBitmapAsync(blurred, OutputOption.Stretch),
            resized = result.Resize(1, 1, WriteableBitmapExtensions.Interpolation.Bilinear);
        return resized.GetPixel(0, 0);
    });
    hslMean = mean.ToHsl();
}
注意:该
DispatcherHelper.GetFromUIThreadAsync
方法只检查对UI线程的线程访问,如果需要,它会将代码调度到通过
CoreApplication.MainView.CoreWindow.Dispatcher
获得的
CoreDispatcher
对象

问题:如果我的应用程序已经打开,则此代码可以100%正常工作,因为之前调用该
DispatcherHelper
类已经创建了
CoreDispatcher
对象,因此该方法只使用存储的dispatcher来安排工作,并且工作正常。但是,如果应用程序在ShareTarget窗口打开时关闭(因此
DispatcherHelper
必须第一次创建dispatcher),则
CoreApplication.MainView.CoreWindow
行会抛出异常。非常奇怪的一个:

COMException
: 对ASTA的COM调用被阻止,因为调用链源自或通过另一个ASTA。此调用模式容易死锁,单元调用控制不允许使用。 对ASTA(线程10276)的COM调用(IID:{638BB2DB-451D-4661-B099-414F34FFB9F1},方法索引:6)被阻止,因为调用链源自或通过另一个ASTA(线程4112)。此调用模式容易死锁,单元调用控制不允许使用


因此,我需要一种方法,使该方法即使在从不同窗口调用时也可靠。我尝试了不同的选择:

#1:仅调用该代码而不分派到其他线程,理论上我此时应该在UI线程上-->失败(应用程序调用了为其他线程封送的接口。(HRESULT的异常:0x8001010E(RPC_错误_线程)))

#2:手动调用
CoreApplication.MainView.corefindown.Dispatcher
来分派代码块-->失败(我得到了上面提到的奇怪的
COMException

#3:手动使用
CoreApplication.MainView.Dispatcher
分派代码块(因为产生异常的是
.CoreWindow
部分)-->失败
COMException
:未找到项)

#4:使用
CoreApplication.GetCurrentView().CoreWindow.Dispatcher
CoreApplication.GetCurrentView().Dispatcher
Window.Current.CoreWindow.Dispatcher
Window.Current.Content.Dispatcher
来计划代码-->失败(又是错误的线程,我得到了通常的编组异常)

所有这些封送异常都是在
result=wait blurEffect.GetBitmapAsync(模糊,OutputOption.Stretch)
行抛出的,因此我怀疑它可能与Lumia Imaging SDK有关。 我的意思是,我很确定我实际上是在UI线程上,否则我就无法创建
WriteableBitmap
类的实例,对吗

为什么我可以创建
WriteableBitmap
对象(据我所知,它们需要在UI线程上创建),但是Lumia SDK中的
GetBitmapAsync
方法总是抛出编组异常?我在应用程序中的任何地方都使用它,没有任何问题,为什么它在ShareTarget窗口中无法工作?我需要做什么吗


感谢您的帮助!

看起来这是Lumia Imaging SDK中的一个bug(最初是为WP8.1编写的,它没有多个窗口/dispatcher),因此除非调用库是从与主应用程序窗口关联的dispatcher发出的(当然,只有当ShareTarget窗口弹出时,应用程序在后台打开时才能检索到),它将失败


此时唯一的解决方案是用不依赖于特定库的其他代码替换对Lumia SDK的调用(例如,在这种情况下,可以从
WriteableBitmap
对象获取ARGB数组并手动计算平均颜色).

@screever是的,我只是在等待accept功能可用,因为我在第一个问题出现后不到48小时就发布了解决方案,谢谢提醒!