簡體   English   中英

HRESULT:使用諾基亞影像SDK時為0x8004C00F

[英]HRESULT: 0x8004C00F while using Nokia Imaging sdk

這是代碼的外觀。

void ApplyFilter()
{
    this.filterOperationInProgress = true;
    WriteableBitmap wBmp = new WriteableBitmap(0, 0);
    wBmp = LocalWriteableBitmap.Clone();
    NokiaFilters nf = new NokiaFilters(wBmp, FilterName.Mango);
    wBmp = nf.render().Result;
    this.filterOperationInProgress = false;
}

NokiaFilter類:

class NokiaFilters
{
    WriteableBitmap wb;
    FilterName filtername = FilterName.NoFilter;
    public NokiaFilters(WriteableBitmap wbm1, FilterName filtername1)
    {
        wb = wbm1;
        filtername = filtername1;
    }

    public async Task<WriteableBitmap> render()
    {
        MemoryStream memstream = new MemoryStream(wb.ToByteArray());
        if (memstream == null)
            return wb;
        //Mango
        else if (filtername == FilterName.Mango)
        {
            memstream.Position = 0;
            // Create a source to read the image from PhotoResult stream
            using (var source = new StreamImageSource(memstream))
            {
                // Create effect collection with the source stream
                using (var filters = new FilterEffect(source))
                {
                    // Initialize the filter 
                    ContrastFilter contrastfilter = new ContrastFilter(0.16);
                    HueSaturationFilter saturationfilter = new HueSaturationFilter(-0.01, -0.53);

                    LomoFilter lomofilter = new LomoFilter(0.5, 0.5, LomoVignetting.Low, LomoStyle.Yellow);
                    // Add the filter to the FilterEffect collection
                    filters.Filters = new List<IFilter> { contrastfilter, saturationfilter, lomofilter };

                   // Create a target where the filtered image will be rendered to
                   var target = new WriteableBitmap((int)wb.PixelWidth, (int)wb.PixelHeight);

                   // Create a new renderer which outputs WriteableBitmaps
                   using (var renderer = new WriteableBitmapRenderer( filters,target))
                   {
                       // Render the image with the filter(s)
                       try
                       {
                           target  = await renderer.RenderAsync().AsTask().ConfigureAwait(false);                                                            
                       }
                       catch (System.InvalidOperationException inv)
                       { }
                       catch { }

                       // Set the output image to Image control as a source
                       return target;
                   }
               }
           }
       }

       return wb;
   }
}

我的UI完全卡住,甚至后退按鈕也沒有響應。 當我停止調試器時,代碼指向

wBmp = nf.render().Result;

在發生這種情況之前開始執行的語句是

target  = await renderer.RenderAsync().AsTask().ConfigureAwait(false);

我是並行編程的新手。 我進行了很多搜索,發現在這種情況下死鎖非常普遍。 我相信這也是一個僵局。 我該如何解決?

更新:

更換后

wBmp = nf.render().Result;

wBmp = await nf.render().ConfigureAwait(false);

我得到HRESULT:捕獲{}之后出現0x8004C00F錯誤

target  = await renderer.RenderAsync().AsTask().ConfigureAwait(false);

這是堆棧跟蹤:

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Nokia.Graphics.Imaging.WriteableBitmapRenderer.<<RenderAsync>b__0>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at SomeApp.NokiaFilters.<render>d__f.MoveNext()

解決了。

更換

MemoryStream memstream = new MemoryStream(wb.ToByteArray());

MemoryStream memstream = new MemoryStream(); wb.SaveJpeg(memstream, wb.PixelWidth, wb.PixelHeight, 0, 100);

您是否嘗試了沒有ConfigureAwait(false);等待ConfigureAwait(false); this.filterOperationInProgress是否綁定到UI? 如果是這樣,則可能是您在UI線程上沒有“更改UI”。

編輯: wb是否有效-PixelWidth和PixelHeight是否大於或等於MemoryStream存儲的圖像?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM