Удалить поток в компоненте конвейера BizTalk? - PullRequest
2 голосов
/ 20 июля 2010

Я довольно плохо знаком с BizTalk и создаю собственный компонент конвейера. Я видел код в примерах, которые похожи на следующее:

public void Disassemble(IPipelineContext pContext, IBaseMessage pInMsg)
{

    Stream originalDataStream = pInMsg.BodyPart.GetOriginalDataStream();
    StreamReader strReader = new StreamReader(originalDataStream);

    string strOriginalData = strReader.ReadToEnd();

    byte[] bufferOriginalMessage = new byte[strOriginalData.Length];
    bufferOriginalMessage = ASCIIEncoding.Default.GetBytes(strOriginalData);

    Stream ms = new MemoryStream();
    ms.Write(bufferOriginalMessage, 0, strOriginalD

    //other stuff here

    ms.Seek(0, SeekOrigin.Begin);
    pInMsg.BodyPart.Data = ms;
}

Но нигде в методе StreamReader не закрывается или не удаляется. Метод просто выходит.

Обычно при использовании StreamReader и других классов рекомендуется использовать оператор using, чтобы поток автоматически удалялся.

Есть ли какая-то конкретная причина (возможно, в BizTalk), по которой вы не располагаете этим StreamReader?

Я не нашел никакой информации по этому вопросу. Кто-нибудь может помочь?

1 Ответ

3 голосов
/ 21 июля 2010

В общем, да, это хорошая практика - закрывать читатели и потоки, которые вам больше не нужны. Тем не менее, не всегда может потребоваться 100% каждый раз. Например, закрытие считывателя будет нормально закрывать основной поток, но, скорее всего, что-то еще, вероятно, уже знает о потоке и само закроет его в нужное время.

Однако рекомендуется добавлять любые потоки, которые вы используете в компоненте конвейера, со временем жизни, соответствующим времени жизни сообщения, в средство отслеживания ресурсов , чтобы BizTalk мог автоматически утилизировать их, когда конвейер выполнение завершается и сообщение обработано.

...