gpt4 book ai didi

c# - 为什么它总是抛出 ObjectDisposedException?

转载 作者:行者123 更新时间:2023-11-30 15:33:52 25 4
gpt4 key购买 nike

由于windows phone不能处理gif,所以写了一点方法,但是好像有点错误。
下面的代码在运行到 (JPG 和 PNG 部分)bitimg.SetSource(e.Result) 时总是抛出异常;
正如它所说,这是否意味着我不能使用 e.Result 因为它已被处置?但是怎么会这样呢,method并没有停止,编译器为什么要dispose呢?

为什么以及如何解决?

错误信息:

{System.ObjectDisposedException: Cannot access a disposed object. Object name: 'MS.Internal.InternalMemoryStream'. at MS.Internal.InternalMemoryStream.Seek(Int64 offset, SeekOrigin origin) at ImageTools.IO.Gif.GifDecoder.Decode(ExtendedImage image, Stream stream) at xicihutong.ViewModel.RichTextBoxBindingBehavior.<>c__DisplayClass7.b__4(Object s, OpenReadCompletedEventArgs e) at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) at System.Net.WebClient.OpenReadOperationCompleted(Object arg)}

image.Loaded += (s1, e1) =>
{
WebClient wc = new WebClient();
wc.AllowReadStreamBuffering = true;
wc.OpenReadCompleted += (s, e) =>
{
if (e.Error == null && !e.Cancelled)
{
//Check the type of the Image
ImageTypeCheck.ImageType incomingIMGType = ImageTypeCheck.getImageType(e.Result);

BitmapImage bitimg = new BitmapImage();
bitimg.CreateOptions = BitmapCreateOptions.BackgroundCreation;

switch (incomingIMGType)
{
//handle GIF for windows phone
case ImageTypeCheck.ImageType.Gif:
Decoders.AddDecoder<GifDecoder>();
Encoders.AddEncoder<JpegEncoder>();
GifDecoder gif = new GifDecoder();
JpegEncoder jpg = new JpegEncoder();
ImageTools.ExtendedImage extImg = new ImageTools.ExtendedImage();
gif.Decode(extImg, e.Result);
using (MemoryStream stream = new MemoryStream())
{
jpg.Encode(extImg, stream);
bitimg.SetSource(stream);
image.Source = bitimg;
}
break;
case ImageTypeCheck.ImageType.Bmp:
case ImageTypeCheck.ImageType.Null:
break;
case ImageTypeCheck.ImageType.Jpg:
case ImageTypeCheck.ImageType.Png:
try
{
bitimg.SetSource(e.Result);
image.Source = bitimg;
}
catch (Exception ex)
{
App.print(ex.Message);
}
break;
}
}
};
wc.OpenReadAsync(new Uri(item, UriKind.Absolute), wc);

==================================

using System.IO;

namespace xicihutong.DataServiceAgent
{
class ImageTypeCheck
{
/// <summary>
/// define
/// </summary>
public enum ImageType
{
Null,Png,Jpg,Gif,Bmp
}


public static ImageType getImageType(Stream stream)
{
ImageType type = ImageType.Null;

byte[] header = new byte[8];
stream.Read(header, 0, 8);

//Check if PNG then do something;
//Check if JPG then do something;
//Check if GIF then do something;

stream.Close();

return type;
}
}
}

最佳答案

正如您自己指出的那样,ImageTypeCheck.getImageType 方法正在关闭流。

您应该如何找到问题?

  1. 错误消息清楚地表明流已被释放。剩下的就是找到罪魁祸首。
  2. 调用堆栈显示在引发错误时正在调用 ImageTools.IO.Gif.GifDecoder.Decode。所以它发生在那之前。
  3. 幸运的是,只有一种方法使用 GifDecoder 之前的流,那就是 ImageTypeCheck.getImageType

要解决此问题,只需从 ImageTypeCheck.getImageType 方法中删除 stream.Close,并将其替换为 Seek 即可回到流的开头(GifDecoder 期望流位于图片的开头)。

stream.Seek(0, SeekOrigin.Begin);

关于c# - 为什么它总是抛出 ObjectDisposedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com