我在我的wpf解决方案中使用xna绘制了大量的行。为此,我使用以下代码行开始这项长期任务:
Task.Factory.StartNew(() => { RenderGraphics(); }, TaskCreationOptions.LongRunning);
" RenderGraphics()"方法很简单,它是一个无限循环:
public void RenderGraphics()
{
//Loop visual rendering.
while (RenderGraphicsActive)
{
//If RefreshMode is "always" explicity call to method render each time step.
if (xnaw.RefreshMode == XNAWpf.WPFXNA.eRefreshMode.Always) { xnaw.Render(); }
}
}
RenderGraphicsActive是一个标志,如您所见,如果此标志设置为false,此方法将永远停止。
现在是它变得有趣的时候。在方法xnaw.Render()中,我在我的" GraphicsDevice"中画了一堆线。 (称为" pDevice"),类似于:
try
{
lock (pDevice) //new code actividad 6
{
if (pDevice.GraphicsDeviceStatus == GraphicsDeviceStatus.Lost)
return;
if (pDevice.GraphicsDeviceStatus == GraphicsDeviceStatus.NotReset)
return;
if (pDevice.IsDisposed == true)
return;
//... //a bunch of code
foreach (Segment segment in Segments)
{
mSimpleEffect.CurrentTechnique.Passes[0].Apply(); //exception here
pDevice.DrawUserPrimitives < VertexPositionColor(PrimitiveType.LineStrip, segment.VertexData, 0, segment.VertexData.Length - 1); //exception here
}
}
}
catch
{
}
它的作用就像一个魅力,但是当pDevice改变时(例如当我更改分辨率时),如果程序已经在foreach中,它会崩溃,大约有10%的时间(它通常没有&#39) ;崩溃),但我必须保证它不会崩溃。