#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. да, я решил просто ничего не делать и доверять пользователям. их проблема в любом случае, если что-то пойдет не так