首页 > 解决方案 > 尝试将字节 [] 发送到服务器时,Xamarin 中的“无法访问已处置对象”异常

问题描述

这个问题的旧版本太长了,所以在解决这个问题的无数次尝试结束时,我想出了所有可以归结为一个简单的问题。为什么这会产生 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();
        }
    }

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

此时在存储库中抛出异常:

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);

同样的错误。

标签: asp.net.netapixamarin

解决方案


我认为你的问题出在这条线上_byteArray = ToByteArray(_array);

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

如果在这个方法里面,请贴出来,我想知道ww

我没有足够的经验来准确地告诉它是关于什么的,但也许我的建议会恰到好处!

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


推荐阅读