@@ -35,6 +35,8 @@ public class DeferredRenderer : RendererBase, IRenderer, IRenderLoopTask, IVisua
35
35
private IRef < IDrawOperation > _currentDraw ;
36
36
private readonly IDeferredRendererLock _lock ;
37
37
private readonly object _sceneLock = new object ( ) ;
38
+ private readonly object _startStopLock = new object ( ) ;
39
+ private readonly object _renderLoopIsRenderingLock = new object ( ) ;
38
40
private readonly Action _updateSceneIfNeededDelegate ;
39
41
40
42
/// <summary>
@@ -139,6 +141,8 @@ public void Dispose()
139
141
}
140
142
141
143
Stop ( ) ;
144
+ // Wait for any in-progress rendering to complete
145
+ lock ( _renderLoopIsRenderingLock ) { }
142
146
DisposeRenderTarget ( ) ;
143
147
}
144
148
@@ -233,20 +237,26 @@ public void Resized(Size size)
233
237
/// <inheritdoc/>
234
238
public void Start ( )
235
239
{
236
- if ( ! _running && _renderLoop != null )
240
+ lock ( _startStopLock )
237
241
{
238
- _renderLoop . Add ( this ) ;
239
- _running = true ;
242
+ if ( ! _running && _renderLoop != null )
243
+ {
244
+ _renderLoop . Add ( this ) ;
245
+ _running = true ;
246
+ }
240
247
}
241
248
}
242
249
243
250
/// <inheritdoc/>
244
251
public void Stop ( )
245
252
{
246
- if ( _running && _renderLoop != null )
253
+ lock ( _startStopLock )
247
254
{
248
- _renderLoop . Remove ( this ) ;
249
- _running = false ;
255
+ if ( _running && _renderLoop != null )
256
+ {
257
+ _renderLoop . Remove ( this ) ;
258
+ _running = false ;
259
+ }
250
260
}
251
261
}
252
262
@@ -255,7 +265,16 @@ public void Stop()
255
265
256
266
void IRenderLoopTask . Update ( TimeSpan time ) => UpdateScene ( ) ;
257
267
258
- void IRenderLoopTask . Render ( ) => Render ( false ) ;
268
+ void IRenderLoopTask . Render ( )
269
+ {
270
+ lock ( _renderLoopIsRenderingLock )
271
+ {
272
+ lock ( _startStopLock )
273
+ if ( ! _running )
274
+ return ;
275
+ Render ( false ) ;
276
+ }
277
+ }
259
278
260
279
/// <inheritdoc/>
261
280
Size IVisualBrushRenderer . GetRenderTargetSize ( IVisualBrush brush )
0 commit comments