当我从ShareTarget合同创建的第二个窗口中调用时,我显然挣扎了一些代码(当您与应用程序共享某些内容时,它会打开一个小的独立窗口)。使用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线程的线程访问,并根据需要将安排代码为CoreDispatcher
对象,与获得CoreApplication.MainView.CoreWindow.Dispatcher
。
问题:此代码的工作100%的罚款,如果我的应用程序已经打开,因为在那时,
CoreDispatcher
对象已经由先前调用到DispatcherHelper
类创建的,因此该方法只使用存储的调度安排工作,它工作正常。 但是,如果在打开ShareTarget窗口时关闭应用程序(因此DispatcherHelper
必须首次创建调度程序),CoreApplication.MainView.CoreWindow
行会引发异常。一个很奇怪的一个:
COMException
: 一个COM调用的ASTA被阻止,因为调用链起源于或通过其他ASTA通过。该呼叫模式容易出现死锁,并且不受公寓呼叫控制的限制。 对ASTA(线程10276)的COM调用(IID:{638BB2DB-451D-4661-B099-414F34FFB9F1},方法索引:6)被阻止,因为调用链始于或通过另一个ASTA(线程4112)。该呼叫模式容易出现死锁,并且不受公寓呼叫控制的限制。
所以,我需要一种方法,使该方法可靠,即使从不同的窗口中被调用。我尝试过不同的选择:
#1:只要调用代码不指派给不同的线程,因为在理论上我应该是在UI线程在这一点上--->FAIL(应用程序称为一个接口,被编组为一个不同的线程。(从HRESULT异常:0x8001010E(RPC_E_WRONG_THREAD)))
#2:手动调用CoreApplication.MainView.CoreWindow.Dispatcher
分派该代码块--->FAIL(我得到的怪异COMException
如上所述)
# 3:手动使用CoreApplication.MainView.Dispatcher
分派码块(因为它是那产生异常的.CoreWindow
一部分)--->FAIL(COMException
:没有找到)
#4:使用CoreApplication.GetCurrentView().CoreWindow.Dispatcher
,CoreApplication.GetCurrentView().Dispatcher
,Window.Current.CoreWindow.Dispatcher
和Window.Current.Content.Dispatcher
调度代码--->失败(又错了线,我得到通常编组除外)
所有这些编组例外是在抛出行result = await blurEffect.GetBitmapAsync(blurred, OutputOption.Stretch)
,所以我怀疑它可能与Lumia Imaging SDK有关。 我的意思是,我很确定我实际上是在UI线程上,否则我不会设法创建WriteableBitmap
类的实例,对吧?
为什么我可以创建
WriteableBitmap
对象(他们需要在UI线程上创建,据我所知),但是从的Lumia的SDK,GetBitmapAsync
方法总是抛出异常编组?我在我的应用程序中的任何地方都没有任何问题地使用它,为什么它不能从ShareTarget窗口中运行?有什么我需要做的吗?
感谢您的帮助!
@清道夫是的,我只是在等待接受功能可用,因为我发布的解决方案不到48小时后,最初的问题,感谢提醒! – Sergio0694