Windows Mobile:Finalizer中的异常终止程序

时间:2009-07-23 08:44:48

标签: c# .net windows-mobile compact-framework

我的Windows移动应用程序有时会因System.Net.HttpReadStream的终结器中发生异常而崩溃。

它有时只会发生,但它会导致整个程序崩溃。当这样的内部终结器抛出时,有什么办法可以让程序继续运行吗?或者,我该如何防止出现这样的错误?

这是异常的堆栈跟踪(不完整,因为我必须输入整个内容......

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引起的,其中没有处理响应。所以请记住,始终处置响应对象,尤其是在Compact Framework中,因为它可以降低整个应用程序的速度!

3 个答案:

答案 0 :(得分:2)

thread描述了类似的问题。

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

答案 1 :(得分:1)

显式关闭(Dipsose)ResponseStream不会受到伤害,如:

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

否则由Reader对象关闭它的流,有点不稳定。

答案 2 :(得分:1)

原来是另一个 HttpWebRequest造成这种情况。我的问题中的代码很好,但在另一个地方没有丢失响应的处理。