[英]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.