C# Windows Mobile:终结器中的异常终止程序

C# Windows Mobile:终结器中的异常终止程序,c#,.net,windows-mobile,compact-framework,C#,.net,Windows Mobile,Compact Framework,我的Windows mobile应用程序有时会崩溃,出现在System.Net.HttpReadStream的终结器中的异常情况 这只是偶尔会发生,但随后会导致整个程序的失败。当这样一个内部终结器抛出时,我能做些什么使程序继续吗?或者,我该如何防止这种错误 这是异常的stacktrace(不完整,因为我必须键入整个内容 ObjectDisposedException at System.Threading.Timer.throwIfDisposed() at System.Threading.

我的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
引起的。因此,请记住,始终处理响应对象,尤其是在Compact Framework中,因为它会导致整个应用程序崩溃

这描述了一个类似的问题

问题可能是您正在第二个using块内返回。这样,响应对象将不会关闭。

显式关闭(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对象关闭其流,这有点不稳定。

结果是另一个
HttpWebRequest
导致了这一点。我问题中的代码很好,但在另一个地方缺少响应的处理。

您是否尝试将代码放入try-catch块中?只是为了澄清:是否发生了这种情况在这段代码中使用,或者流是由GC最终确定的?您是否有一个try/catch围绕着它?它不会发生在调用代码中,它会在GC启动后发生。而且由于它是一个内部的.NET对象,所以我不能在它周围放置try/catch。然后,我所学到的关于使用keywork或try/finally的所有内容都会被删除错…但我也在使用.NET CF 3.5,就像你提到的线程一样。至少我不是唯一一个这样做的人;)老实说,我不知道当你在使用块中返回时会发生什么。在这种情况下,可能不会调用终结器。无论如何,这样做是不好的做法。将return语句从using块中移出。我认为这不是一个坏习惯。如果只在最后返回,每个函数看起来都是普通的C。即使是C++,我从一个方法中返回,并让编译器找出在OTI意思是这样做的时候调用哪个析构函数:使用{ }返回结果;并且不使用{…返回结果;}