Jeśli przekierować Console.Out
do instancji StringWriter
można wtedy uzyskać tekst, który został napisany do konsoli:
StringWriter writer = new StringWriter();
Console.SetOut(writer);
StringBuilder consoleOut = writer.GetStringBuilder();
string text = consoleOut.ToString();
Jeśli zrobisz to w nowej Form
można następnie ankietę w odstępach czasu, aby uzyskać tekst zapisany na konsoli i umieścić jego wartość na TextBox
. Surowy przykład:
public MyForm()
{
InitializeComponent();
StringWriter writer = new StringWriter();
Console.SetOut(writer);
Timer timer = new Timer();
timer.Tick += (o, s) => textBox.Text = writer.GetStringBuilder().ToString();
timer.Interval = 500;
timer.Start();
}
kilka rzeczy, aby być ostrożnym z:
StringWriter
jest jednorazowy, więc technicznie trzeba pozbyć się go po zakończeniu (choć w rzeczywistości jego metoda Dispose()
robi nic tak naprawdę nie jest poważnym problemem).
StringWriter
przechowuje wewnętrzny StringBuilder
zawierający cały tekst do niego napisany do tej pory. Z czasem tylko się powiększy, więc im dłużej aplikacja będzie działać, tym więcej pamięci będzie zużywać. Możesz wprowadzić pewne kontrole, aby okresowo je usuwać po osiągnięciu określonego rozmiaru.
- Jeśli interwał będzie zbyt mały, będziesz ciągle używać procesora.
- Po zamknięciu formularza należy ustawić wartość
Console.Out
z powrotem na oryginalną wartość, w przeciwnym razie nie będzie można ponownie drukować komunikatów na konsoli.
dzięki za szczegółową odpowiedź. Dam ci szansę. –
Nie naprawiłem jeszcze problemu z pamięcią typu stringbuilder, ale w zasadzie działa. Wielkie dzięki. Powinienem być w porządku stąd. –
Doskonała odpowiedź btw. –