尝试向服务器发送 byte[] 时,Xamarin 中出现“无法访问已处置对象”异常

问题描述 投票:0回答:2

这个问题的旧版本太长了,所以在多次尝试解决这个问题之后,我发现所有的问题都可以归结为一个简单的问题。为什么这会产生

SystemObjectDisposed
.

private async void PickPhotoButton_OnClicked(object sender, EventArgs e)
{
        _globalStream = await DependencyService.Get<IPicturePicker> 
           ().GetImageStreamAsync();
        _globalArray = StreamToByteArray(_globalStream);

        var gal = new GalleryResource()
        {
            Pic = _globalArray
        };

        MemoryObjects.CurrentGallery = gal;
        var ctr = HelperMethods.GetInstance<GalleryController>();
        await ctr.Post();


 }

public byte[] StreamToByteArray(Stream input)
{
    using (MemoryStream ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

流从本机端到达,我将其转换为字节数组并将其传递到我的存储库中。一切都使用虚拟字节数组,因此流对象出现问题,可能会在此时关闭或处置。

此时存储库中抛出异常:

var response = await _client.PostAsync(endPoint, _repService.ConvertObjectToStringContent(obj));

ConvertObjectToStringContent(obj)
- 不是这一部分。从这里开始,它实际上返回一个值,并且在调试中可以看到字节数组,即字节数组始终保持有效长度。

当我们从库中挑选完照片后,发生的唯一事件如下:

void OnImagePickerFinishedPickingMedia(object sender, 
   UIImagePickerMediaPickedEventArgs args)
{
    UIImage image = args.EditedImage ?? args.OriginalImage;

    if (image != null)
    {
        // Convert UIImage to .NET Stream object
        NSData data = image.AsJPEG(1);
        Stream stream = data.AsStream();
        

        // Set the Stream as the completion of the Task
        taskCompletionSource.SetResult(stream);
    }
    else
    {
        taskCompletionSource.SetResult(null);
    }
    imagePicker.DismissModalViewController(true);
}

但是它似乎没有处理流,即使它处理了,我们也已经从中得到了一个字节数组。


甚至尝试在本机代码中执行此操作

 var client = new HttpClient();
                var c = new MultipartFormDataContent();
                c.Add(new StreamContent(image.AsJPEG(1).AsStream()));
                var response = await client.PostAsync(Settings.EndPoint + "api/gallery/", c);

同样的错误。

c# asp.net .net xamarin
2个回答
0
投票

我认为你的问题出在这一行的某个地方

_byteArray = ToByteArray(_array);

ToByteArray(stream)
似乎可能通过从流转换来返回字节数组,并且该流可能仍然具有对字节数组的引用。它可能已经被处置了。

如果在这个方法中,请发布它,我想知道ww

我的经验不够丰富,无法准确说出它的内容,但也许我的建议会击中正确的位置!

顺便说一句,你的代码看起来很干净,我喜欢它!


0
投票

所以,虽然这个问题确实首先是在 CrossMedia 插件中出现的 https://github.com/jamesmontemagno/MediaPlugin 它也犯了同样的错误。

但是,只有当您选择这样的照片时才会出现错误:

var _mediaFile = await CrossMedia.Current.PickPhotoAsync();

所以,当我这样做时:

var _mediaFile = await CrossMedia.Current.PickPhotoAsync(new 
Plugin.Media.Abstractions.PickMediaOptions
        {
            PhotoSize = Plugin.Media.Abstractions.PhotoSize.Small,
            CompressionQuality = 90,
        });

错误消失了。不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.