首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确处理responseStream和StreamReader关闭

正确处理responseStream和StreamReader关闭
EN

Stack Overflow用户
提问于 2013-10-09 08:17:51
回答 2查看 493关注 0票数 2

我有一个用C#编写的独立处理程序(C#),它处理携带XML有效负载的传入推送通知,然后解析这些XML并提取和处理从它们获取的任何必要信息。问题是我不能在本地测试这一点,因为我们的开发环境防火墙太重,并且不允许对传入的通知允许异常。

我已经在我们的测试环境中测试了这一点,并且正在正确地接收和处理通知,但是在随机的代码检查之后,我处理responseStreamsstreamReaders的方式可能会出现问题。

我的问题是,这是处理关闭这些资源的有效方法,还是可能导致NullReferenceException

处理这些资源的标准实践是什么,我应该使用using语句将它们仅用于该范围,还是该代码就足够了?

代码语言:javascript
复制
Stream responseStream = null;
StreamReader reader = null;
string serverResponse = null;

try
{
    responseStream = response.GetResponseStream();
    reader = new StreamReader(responseStream);
    serverResponse = reader.ReadToEnd();
}

finally
{
    if (reader == null)
    {
        reader.Close();
    }

    if (responseStream == null)
    {
        responseStream.Close();
    }

    response.Close();
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-09 08:23:44

最好使用using块:

代码语言:javascript
复制
string serverResponse = null;
using (Stream responseStream = response.GetResponseStream())
{
   using (StreamReader reader = new StreamReader(responseStream))
   {
       serverResponse = reader.ReadToEnd();
   }
}

这样,即使using语句中有异常,也将正确关闭所有流。

票数 2
EN

Stack Overflow用户

发布于 2013-10-09 08:29:27

除了您的代码之外,我还想使用以下内容:

代码语言:javascript
复制
responseStream.Seek(0, SeekOrigin.Begin);

using (StreamReader sr = new StreamReader(responseStream))
{
    message = sr.ReadToEnd();
}

如果你的响应流在某种程度上失败了,比如它在另一端被提前关闭,协议中有错配等等,我会加一个“catch”呢?

看看CommunicationException类

就我个人而言,我不喜欢嵌套的使用语句,尽管如果您必须使用它们,那么请查看AggregateExceptions。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19266542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档