代码之家  ›  专栏  ›  技术社区  ›  chris166

Windows Mobile:终结器终止程序中出现异常

  •  3
  • chris166  · 技术社区  · 15 年前

    我的Windows Mobile应用程序有时会崩溃,但在 System.Net.HttpReadStream .

    它只是有时发生,但随后它会使整个程序中断。当这样一个内部终结器抛出时,我能做些什么使程序继续吗?或者,我怎样才能防止这样的错误呢?

    这是异常的stacktrace(不完整,因为我必须键入整个事件…

    ObjectDisposedException
    
    at System.Threading.Timer.throwIfDisposed()
    at System.Threading.Timer.Change(UInt32 dueTime, UInt32 period)
    at ...
    at System.Net.ContentLengthReadStream.doClose()
    at System.Net.HttpReadStream.Finalize()
    

    呼叫代码为:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(actionUrl);
    request.AllowAutoRedirect = true;
    request.AllowWriteStreamBuffering = true;
    request.Method = "POST";
    request.ContentType = "application/json";
    
    using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
    {
        JsonSerializer serializer = new JsonSerializer();
        serializer.Serialize(writer, myRequestObject);
    }
    
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            JsonSerializer serializer = new JsonSerializer();
            MyResultObject result = (MyResultObject)serializer.Deserialize(reader, typeof(MyResultObject));
    
            return result;
        }
    }
    

    更新

    上面的呼叫码没问题。这个问题是由另一个 HttpWebRequest 未释放响应。因此,请记住,始终要处理响应对象,尤其是在紧凑的框架中,因为它可以关闭整个应用程序!

    3 回复  |  直到 15 年前
        1
  •  2
  •   kgiannakakis    15 年前

    这个 thread 描述了类似的问题。

    问题可能是您正在返回第二个使用块。这样响应对象就不会被关闭。

        2
  •  1
  •   Henk Holterman    15 年前

    明确地关闭(插入)响应流不会造成伤害,如:

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream respStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(respStream))
    {
      JsonSerializer serializer = new JsonSerializer();
      MyResultObject result =
        (MyResultObject)serializer.Deserialize(reader, typeof(MyResultObject));
    
      return result;
    }
    

    否则,这取决于读者对象来关闭它的流,有点不稳定。

        3
  •  1
  •   chris166    15 年前

    结果是 另一个 HttpWebRequest 造成这种情况。我问题中的代码很好,但另一个地方缺少对响应的处理。