C# 使用ShareTarget第二个窗口中的代码编组异常
我的一些代码很难处理,当从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 (
// 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小时就发布了解决方案,谢谢提醒!