Имел такую же потребность и очень ценил эту помощь. Это слегка измененная версия.
Создать список:
<ListBox x:Name="lbLog" Background="LightGray"></ListBox>
В главном потоке (в начальной части кода) поместите это, чтобы сохранить ссылку на поток пользовательского интерфейса:
Thread m_UIThread;
....
m_UIThread = Thread.CurrentThread;
Тогда это ваш метод журнала, вызываемый из любого потока:
public void AddToLog(String message)
{
if (Thread.CurrentThread != m_UIThread)
{
// Need for invoke if called from a different thread
this.Dispatcher.BeginInvoke(
DispatcherPriority.Normal, (ThreadStart)delegate()
{
AddToLog(message);
});
}
else
{
// add this line at the top of the log
lbLog.Items.Insert(0, message);
// keep only a few lines in the log
while (lbLog.Items.Count > LOG_MAX_LINES)
{
lbLog.Items.RemoveAt(lbLog.Items.Count-1);
}
}
}