"Two threads" is of course the problem. They cannot allow both threads to access the backBuffer at the same time. You must use a lock to prevent this from happening. Roughly:
private object bufferLock = new object();
...
using (var front = Graphics.FromHwnd(Handle)) {
lock (bufferLock) {
front.DrawImage(backBuffer, 0, 0);
}
}
and
lock (bufferLock) {
using (var g = Graphics.FromImage(backBuffer) { // No more error
g.Clear(Color.WhiteSmoke);
Render(g);
}
}
The rest doesn't look that healthy either, you are not making sure you properly ping-pong between the two threads and it is very unclear what thread owns the window.