ObjectDisposedException при выводе на консоль - PullRequest
1 голос
/ 25 мая 2010

Если у меня есть следующий код, у меня нет проблем во время выполнения или компиляции:

if (ConsoleAppBase.NORMAL_EXIT_CODE == code)
{
    StdOut.WriteLine(msg);
}
else
{
    StdErr.WriteLine(msg);
}

Однако, пытаясь сделать это более кратким, я переключился на следующий код:

(ConsoleAppBase.NORMAL_EXIT_CODE == code
    ? StdOut
    : StdErr
).WriteLine(msg);

Когда у меня есть этот код, я получаю следующее исключение во время выполнения:

System.ObjectDisposedException: невозможно записать в закрытый TextWriter

Можете ли вы объяснить, почему это происходит? Могу ли я избежать этого и получить более краткий код, как я хотел?

Редактировать: упс, извините, я забыл отметить, откуда происходят эти загадочные StdOut и StdErr:

/// <summary>
/// Define these so that they can be accessible to unit tests so that
/// a different TextWriter instance can be used for capturing output
/// for verification.
/// </summary>
internal static TextWriter StdOut = Console.Out;
internal static TextWriter StdErr = Console.Error;

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

Обновите снова: Оказывается, в моих тестах я перенаправил стандартную ошибку, но не стандартную ошибку, но затем я попытался записать стандартную ошибку, и она вылетела. Мое исправление:

var standardOut = new StreamWriter(Console.OpenStandardOutput())
                      {
                          AutoFlush = true
                      };
Console.SetOut(standardOut);

// Added this:
var standardError = new StreamWriter(Console.OpenStandardError())
                        {
                            AutoFlush = true
                        };
Console.SetError(standardError);

Я отмечаю ответ ChaosPandion как правильный, так как он правильно определил мой тест как шумиху.

Ответы [ 2 ]

0 голосов
/ 25 мая 2010

Я считаю, что метод, который вы ищете:

Console.WriteLine(msg);

И

Console.Error.WriteLine(msg);

Edit:

Я полагаю, что для использования Console.Out и Console.Error вам может потребоваться установить их с помощью методов SetError и SetOut.

Вместо этого вы можете попытаться вызвать эти функции:

Console.OpenStandardError();
Console.OpenStandardOutput();

Это означает, что вам, возможно, придется создавать собственных писателей и управлять закрытием потока, поскольку они возвращают System.IO.Stream объектов.

Итак:

TextWriter StdOut = new TextWriter(Console.OpenStandardOutput());
TextWriter StdErr = new TextWriter(Console.OpenStandardError());

Я просто использую Console.Write / Console.WriteLine в своем коде. Также Debug.Write и Debug.WriteLine для потока ошибок.

0 голосов
/ 25 мая 2010

Единственное объяснение состоит в том, что обстоятельства вашего теста разные. Например, в первом тесте вы пишете StdOut, а во втором тесте вы пишете StdErr из-за какой-то ошибки. Откройте отладчик и убедитесь, что вы не утилизируете ни один из них перед выполнением этого кода.

...