It really depends how much you do. Liocks are not an issue if you are not stupid programming your update logic.
Normally you would go client/server internally. The UI has it's own model it "renders", the logic has it's own non-visual model.
You can work with 2 queues (to model, to visual) where status updates are inserted (operations to logic, ui updates to visual model).
Then the WPF - timing or triggered wise - pulls updates from the queue and updates the model, making the visual changes as it is going.
Works pretty nice depending on the "game" you do. My "game" is a financial trading application working pretty exactly like that (albeit I have X visual queues, as multiple screens have all their own UI thread).