我继续为Windows编程而奋斗。:)
当调用该方法时:
public static async Task<string> ConvertToBase64(this BitmapImage bitmapImage)
{
RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri(bitmapImage.UriSource);
var streamWithContent = await rasr.OpenReadAsync();
byte[] buffer = new byte[streamWithContent.Size];
var result = await streamWithContent.ReadAsync(buffer.AsBuffer(), (uint)streamWithContent.Size, InputStreamOptions.None);
using (MemoryStream ms = new MemoryStream(result.ToArray()))
{
return Convert.ToBase64String(ms.ToArray());
}
}从…
public async void SetPhotoString(BitmapImage bi)
{
photoBase64 = await bi.ConvertToBase64();
}在类Offer中,按钮回调:
public async void Post()
{
var newOffer = new Offer()
{
BookAuthor = Author,
BookTitle = Title,
CurrencyWorth = Price,
Description = Description,
StartedAt = DateTime.UtcNow,
Status = OfferStatus.Added
};
newOffer.SetPhotoString(Photo);//this line throws an excp.
var result = await offerService.AddOffer(newOffer);
if (result != null)
ClearFormula();
}我把"NotImplementedException“提高了。我想我在异步调用中做错了什么,但是我不知道是什么。
异常详细信息:message: The method or operation is not implemented.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at SecondHandBookshop.Shared.Helpers.BitmapImageExtensions.<ConvertToBase64>d__0.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.TaskAwaiter`1.GetResult()
at SecondHandBookshop.Shared.Models.Offer.<SetPhotoString>d__0.MoveNext()进一步的信息:照片是我的AddNewOfferViewModel的一个AddNewOfferViewModel属性,用作图像控件的源。它是从机芯装置上的摄像机上捕捉到的:
public async void TakeAPhoto()
{
ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("TestPhoto.jpg",
CreationCollisionOption.GenerateUniqueName);
await _mediaCapture.CapturePhotoToStorageFileAsync(imgFormat, file);
Photo = new BitmapImage(new Uri(file.Path));
await MediaCapture.StopPreviewAsync();
NotifyOfPropertyChange(() => Photo);
ShowCaptureFrame = false;
NotifyOfPropertyChange(() => ShowCaptureFrame);
}当我将给出和例外的行替换为:
newOffer.PhotoBase64 = await Photo.ConvertToBase64();我有个例外:
Additional information: Value does not fall within the expected range.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at SecondHandBookshop.Shared.Helpers.BitmapImageExtensions.<ConvertToBase64>d__0.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.TaskAwaiter`1.GetResult()
at SecondHandBookshop.WindowsPhone.ViewModels.AddOfferViewModel.<Post>d__1.MoveNext()发布于 2015-05-07 12:42:05
为什么您的ConvertToBase64代码没有被期待?这是完全错误的,因为async void的结构。
尝试将代码更改为如下内容:
newOffer.photoBase64 = await SetPhotoString(Photo);//this line throws an excp.
public async Task<string> SetPhotoString(BitmapImage bi)
{
return await bi.ConvertToBase64();
}另外,ConvertToBase64方法的哪一行会抛出异常?
连续手术时会出现异常吗?
如果不是,那么用于async代码的一些类没有正确地实现GetAwaiter方法,这导致了异常。
如果是的话,您没有向我们展示Photo属性的问题。您的代码中可能有一些未实现的方法。
发布于 2015-05-07 12:52:26
尝试在ConvertToBase64扩展方法中返回一个任务。
using (MemoryStream ms = new MemoryStream(result.ToArray()))
{
return Task.FromResult(Convert.ToBase64String(ms.ToArray()));
}https://stackoverflow.com/questions/30101136
复制相似问题