Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
This example shows how to make a multi-threaded handler for the built in Console commands.
You can set Console.Out to any TextWriter. So you simply have to create your own TextWriter to handle cross-threaded handling of messages to your user interface.
Below is an example of a writing Console messages to a TextBox from two different threads.
TextBoxOutputter.cs
using System;
using System.IO;
using System.Text;
using System.Windows.Controls;
namespace WpfApplication68
{
public class TextBoxOutputter : TextWriter
{
TextBox textBox = null;
public TextBoxOutputter(TextBox output)
{
textBox = output;
}
public override void Write(char value)
{
base.Write(value);
textBox.Dispatcher.BeginInvoke(new Action(() =>
{
textBox.AppendText(value.ToString());
}));
}
public override Encoding Encoding
{
get { return System.Text.Encoding.UTF8; }
}
}
}
Note: It's using the TextBox's Dispatcher to append the text. This prevents threading problems.
MainWindow.xaml
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication68.MainWindow"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication68">
<Grid>
<TextBox Height="200" Width="400" x:Name="TestBox"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Threading;
namespace WpfApplication68
{
public partial class MainWindow : Window
{
TextBoxOutputter outputter;
public MainWindow()
{
InitializeComponent();
outputter = new TextBoxOutputter(TestBox);
Console.SetOut(outputter);
Console.WriteLine("Started");
var timer1 = new Timer(TimerTick, "Timer1", 0, 1000);
var timer2 = new Timer(TimerTick, "Timer2", 0, 500);
}
void TimerTick(object state)
{
var who = state as string;
Console.WriteLine(who);
}
}
}
This small article is part of a series of WPF "How To" articles, in response to real user questions on the MSDN WPF Forum.