首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步任务引发NotImplementedException

异步任务引发NotImplementedException
EN

Stack Overflow用户
提问于 2015-05-07 12:30:10
回答 2查看 2.2K关注 0票数 0

我继续为Windows编程而奋斗。:)

当调用该方法时:

代码语言:javascript
复制
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());
    }
}

从…

代码语言:javascript
复制
public async void SetPhotoString(BitmapImage bi)
{
    photoBase64 = await bi.ConvertToBase64();
}

在类Offer中,按钮回调:

代码语言:javascript
复制
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.

代码语言:javascript
复制
    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属性,用作图像控件的源。它是从机芯装置上的摄像机上捕捉到的:

代码语言:javascript
复制
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);
    }

当我将给出和例外的行替换为:

代码语言:javascript
复制
newOffer.PhotoBase64 = await Photo.ConvertToBase64();

我有个例外:

代码语言:javascript
复制
    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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-07 12:42:05

为什么您的ConvertToBase64代码没有被期待?这是完全错误的,因为async void的结构。

尝试将代码更改为如下内容:

代码语言:javascript
复制
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属性的问题。您的代码中可能有一些未实现的方法。

票数 0
EN

Stack Overflow用户

发布于 2015-05-07 12:52:26

尝试在ConvertToBase64扩展方法中返回一个任务。

代码语言:javascript
复制
using (MemoryStream ms = new MemoryStream(result.ToArray()))
{
    return Task.FromResult(Convert.ToBase64String(ms.ToArray()));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30101136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档