блокировать вывод консоли для вызова метода

#c# #multithreading

#c# #многопоточность

Вопрос:

Я делаю что-то вроде

 interface ICalculable
{
    public int Calculate(int input);
}

BigMethod(ICalculable calculable)
{
    Console.Write("Sequence:");
    for (int i = 0; i < 3; i  )
    {
        int result = calculable.Calculate(i);
        Console.Write($" {i}:{result}");
    }
}
  

Любой код, выполняемый внутри ICalculable#Calculate , не должен иметь возможности записи в консоль.

Я не хочу, чтобы ICalculable передаваемое в BigMethod могло прерывать BigMethod вывод консоли, даже если я передаю экземпляр

 class MyCalculable : ICalculable
{
    public int Calculate(int input)
    {
        Console.Write("ruin output");
        return 0;
    }
}
  

Вывод, отображаемый на консоли, должен быть

 Sequence: 0:0 1:0 2:0
  

BigMethod должна каким-то образом быть возможность отключить его вызов Calculate .

Есть ли способ сделать это?


Я уже думал об использовании a, StringBuilder но я хочу BigMethod , чтобы вывод был потоковым.

Комментарии:

1. подождите секунду, так с чем вы хотите что-то сделать Console.Write("Doctor, please keep touching me "); ? значит, вы никогда не хотите, чтобы это отображалось?

2. @TheGeneral Я никогда не хочу, чтобы это отображалось, что-то внутри IRunnable#Run не должно записываться в консоль

3. Похоже, вы хотите что-то вроде async или фоновой обработки, но затем вы заявляете, что вывод BigMethod не должен прерываться?

4. если вы этого не делаете, чтобы показать, почему вы хотели, чтобы это был параметр?

5. Попробуйте консоль. Настройка для перенаправления потока

Ответ №1:

Вы можете использовать Console.SetOut , и Console.Out

 public static void Main()
{
   Console.Write("Hello ");

   // current output
   var current = Console.Out;

   // change the output to somewhere else
   Console.SetOut(new StreamWriter(Stream.Null));

   Run();

   // revert back
   Console.SetOut(current);

   Console.WriteLine("there");
}

private static void Run()
{
   Console.Write("Doctor, please keep touching me ");
}
  

Вывод

 Hello there
  

Однако это кажется немного подозрительным / XY и может привести к возмутительно странным результатам, если вы используете потоки.

Комментарии:

1. да, я решил просто ничего не делать и доверять пользователям. их проблема в любом случае, если что-то пойдет не так