private void Render(object state) { if (!RenderControl.IsDisposed && _stopwatch.ElapsedTicks >= FrameTicks) { _stopwatch.Restart(); Bitmap finalBitmpap; Bitmap screenBitmap; Bitmap borderBitmap; _screenBitmapTripleBufferingSystem.TryGetNextConsumerBuffer(out screenBitmap); if (BorderVisible) { _borderBitmapTripleBufferingSystem.TryGetNextConsumerBuffer(out borderBitmap); using (var g = Graphics.FromImage(_compositeBitmap)) { g.DrawImage(screenBitmap, _borderedScreenRectangle, _screenRectangle, GraphicsUnit.Pixel); g.DrawImage(borderBitmap, _borderRectangle, _borderRectangle, GraphicsUnit.Pixel); } finalBitmpap = _compositeBitmap; } else { finalBitmpap = screenBitmap; } // Calls to GDI+ should be thread-safe for the most part, so we only have to take a little bit of care for ensuring correctness. // CreateGraphics is one of the few thread-safe members of Control. :) using (var g = RenderControl.CreateGraphics()) { g.CompositingMode = CompositingMode.SourceCopy; g.CompositingQuality = CompositingQuality.HighSpeed; g.PixelOffsetMode = PixelOffsetMode.Half; g.SmoothingMode = SmoothingMode.None; g.InterpolationMode = InterpolationMode.NearestNeighbor; g.DrawImage(finalBitmpap, RenderControl.ClientRectangle); } } var tcs = state as TaskCompletionSource <bool>; if (tcs != null) { if (RenderControl.IsDisposed) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(true); } } }