Есть много способов сделать это в WPF, но вот один очень простой способ, используя Task
для выполнения работы в другом потоке и последующей отправки обновления пользовательского интерфейса обратно в основной поток:
Task.Factory.StartNew(() =>
{
// some work (packet sniffing)
// update UI
this.Dispatcher.BeginInvoke(new Action(() =>
{
// update my controls here
}));
});