當我從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